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>