

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>