MediaRecorderで録音する



MediaRecorderで録音する方法を紹介します。 音声ファイルを再生する では、MediaPlayerの使い方を紹介しました。MediaRecorderを使えば、MediaPlayerで再生したのと同じぐらい簡単に、音声を記録することが可能です。

状態遷移

MediaRecorderはステートマシン(状態遷移図)に従い動作します。Recorderの状態は簡単に、

  • Initial:初期状態
  • Initialized:リソース設定完了状態
  • DataSourceConfigured:出力設定状態
  • Prepared:準備完了状態
  • Recording:記録中状態

と表現されていて、MediaRecorderを使うには上から順に下へ状態を遷移する必要があります
(2010/11/30追記 上記状態は解説のために抜粋しています。他にError状態、Released状態があります。 @s_isomoto さん、指摘ありがとうございました!)

録音に至るまでの間に、Initial→Initialized→Prepared→Recording状態と順番に遷移します。
これら状態遷移のトリガ(きっかけ)はMediaRecorderのメソッド呼び出しです(例 MediaRecorder#setAudioSource() )。

以下のサンプルコードのメソッドの呼び出し順には意味があり、とても大切です。
(ここまで呼んで状態遷移に興味を持った方は是非、MediaRecorderのリファレンスを確認ください)

サンプルコード

スタートボタンを押下した際に、録音を開始するサンプルコードです

    MediaRecorder recorder;

	public void onClick(View v) {
		// Activity implements OnClickListener

		switch(v.getId()){

		case R.id.Start:	//スタートボタン押下

			recorder = new MediaRecorder();
		    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
		    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
		    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

		    //保存先
		    String filePath = Environment.getExternalStorageDirectory() + "/audio.3gp";
		    recorder.setOutputFile(filePath);

		    //録音準備&録音開始
		    try {
				recorder.prepare();
			} catch (Exception e) {
				e.printStackTrace();
			}
			recorder.start();	//録音開始
		    break;

スタートボタンを押されたあとにMediaRecorderの入力・フォーマット・エンコーダを設定します。録音開始のMediaRecoder#start()まで複数のメソッドを順番に呼び出します(状態遷移に従った順序なので間違えると動作しなくなります)。たとえば「setAudioEncoderはsetOutputFormatの後、prepareの前で呼び出さなければならない」など各APIごとに順序が存在します。

USBストレージモードの解除


保存先に外部SDを指定していますので、USBデバッグ時はUSBストレージモードを解除してください(SDカードのパスが利用不可となり、意図しないところでエラーとなってしまいます)。
※より詳細な内容はSDカードにファイルを保存するで紹介しています。

		case R.id.Stop:			//ストップボタン押下
		    recorder.stop();
		    recorder.reset();   //オブジェクトのリセット
			//release()前であればsetAudioSourceメソッドを呼び出すことで再利用可能
		    recorder.release(); //Recorderオブジェクトの解放
		    break;

ストップボタン押下時はシンプルな構成です。記録を停止して、オブジェクトを解放します。

MediaRecorderの主なメソッド(録音関係)

メソッド名 概要
setAudioSource() 入力ソースを指定する
setOutputFormat() エンコード方式(3gpなど)を指定
setAudioEncoder() オーディオエンコーダを指定
setOutputFile() 出力先設定(パス)
prepare() 録音準備を行う
start() 録音の開始
stop() 録音の停止
reset() オブジェクトのリセット(setAudioSourceメソッドを呼び出すことでオブジェクトの再利用が可能)
release() MediaRecorderオブジェクトの解放(再利用不可)


MediaRecoderの主なメソッド(抜粋)です。setAudioSourceなど入力設定から出力ファイルのPathまで、録音に関するAPIです。

フォーマット設定

MediaRecoder#setOutputFormat(int);は3GP以外にも以下の設定値を利用できます
MediaRecorder.OutputFormat.DEFAULT
MediaRecorder.OutputFormat.MPEG_4
MediaRecorder.OutputFormat.RAW_AMR : 近々MediaRecorder.OutputFormat.AMR_NBに変更予定
MediaRecorder.OutputFormat.THREE_GPP :3GPPフォーマット

オーディオ入力の設定

MediaRecorder#setAudioSource(int);では、サンプルコードでは引数にMediaRecorder.AudioSource.MICを指定しましたが、
他にも以下のようなデバイスが指定できます。

MediaRecorder.setAudioSourceの設定値

設定値 概要
CAMCORDER カメラデバイス(利用不可の場合DEFAULT)
DEFAULT デフォルト値を利用(機器依存)
MIC マイク
VOICE_CALL 受話+送話両方を録音
VOICE_DOWNLINK 受話のみ録音
VOICE_RECOGNITION 音声認識(利用不可の場合DEFAULT)
VOICE_UPLINK 送話のみ録音

パーミッションの設定

マイクを使う際にはパーミッションを追加する必要があります(今回は外部SDも利用してるため、余分にパーミッションを足しています)
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.jpn.techbooster.sample.mediarecorderActivity"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
    ・・・省略・・・
    </application>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
</manifest>
2 Comments