2011年5月18日水曜日

[Android]ボイスレコーダを作成する

今日はボイスレコーダ(簡易)を作成してみようと思います。
音声データを録音するにはMediaRecorderを使用します。

このMediaRecorderは順番どおりに使用しないと使えないという厄介な代物。
順番を簡単に書くとこんな感じです。
1.インスタンスを作成
2.入力ソースの設定
3.記録フォーマットを設定
4.音声コーデックを設定
5.出力パスを設定する
6.録音準備
7.録音開始
8.録音の停止
9.レコーダの状態をリセット
10.レコーダリソースを解放

案外手順が多いですね(汗)
というわけで順番に見ていきましょう。

と、まず今回は
マイクからの入力とSDカードの出力を行うのでパーミッションを指定します。
AndroidManifest.xmlに以下を追記します。

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

それでは解説いってみます。

0.まずは変数として定義します。
onDestroyでも使用するのでメンバ変数(クラス内で定義)として定義します。

  1. private MediaRecorder mRecorder;  

1.インスタンスを作成
  1. // MediaRecorderのインスタンスを作成  
  2. mRecorder = new MediaRecorder();  

2.入力ソースの設定
通常はマイクからなのでマイクを指定します。
このあたりは使用する端末によりけりですが、だいたいはマイクです。
  1. // マイクからの入力とする  
  2. mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  

3.記録フォーマットを設定
対応しているフォーマットは端末スペックによりますが、
だいたいは3GPPですね。
  1. // 記録フォーマットを3GPPに設定  
  2. mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  

4.音声コーデックを設定
コーデックもいろいろある(はず)ですが、
ここではAMR-NBを使用。
  1. // 音声コーデックをAMR-NBに設定  
  2. mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  

5.出力パスを設定する
作成したファイルをどこに出力するかを設定します。
今回はSDカード直下に設定。(ファイル名を変えないと上書きされます)
  1. // 出力ファイルパスを設定  
  2. mRecorder.setOutputFile("/sdcard/audio_sample.3gp");  

6.録音準備
いよいよレコーダーの準備です。
エラーがでてはいけないので、try-catchで囲みます。
  1. try {  
  2.  // レコーダーを準備  
  3.  mRecorder.prepare();  
  4.    
  5. catch(IllegalStateException e) {  
  6.  e.printStackTrace();  
  7.    
  8. catch(IOException e) {  
  9.  e.printStackTrace();  
  10. }  

7.録音開始
実際に録音するときはこのメソッドを呼ぶだけ。
  1. // 録音開始  
  2. mRecorder.start();  

8.録音の停止
9.レコーダの状態をリセット
停止するときはエラーが起きてはいけないのでやはりtry-catchで囲みます。
停止したら再利用できるようにレコーダの状態をリセットします。
  1. try {  
  2.  // 録音停止  
  3.  mRecorder.stop();  
  4.  // 再使用に備えてレコーダーの状態をリセット  
  5.  mRecorder.reset();  
  6.      
  7. catch(IllegalStateException e) {  
  8.  e.printStackTrace();  
  9. }  

10.レコーダリソースを解放
アプリケーションを終了するとき(Activityの終了時)にリソースを解放します。
これを忘れないように注意。
  1. @Override  
  2. protected void onDestroy() {  
  3.  super.onDestroy();  
  4.  // 使わなくなった時点でレコーダーリソースを解放  
  5.  mRecorder.release();  
  6. }  

以上で一通りができます。
以下のコードは私が実際にかいたものです。
ボタンを押したら録音を開始します。同じくボタンを押したら終了します。
同じボタンを使用しているのフラグで制御していますよ、と。
  1. import java.io.IOException;  
  2.   
  3. import android.app.Activity;  
  4. import android.media.MediaRecorder;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8.   
  9. public class VoiceAcitivity extends Activity {  
  10.   
  11.  private MediaRecorder mRecorder;  
  12.  private boolean mRecordingFlag = false;  
  13.    
  14.    
  15.  @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.           
  20.         // MediaRecorderのインスタンスを作成  
  21.         mRecorder = new MediaRecorder();  
  22.           
  23.         // マイクからの入力とする  
  24.         mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);  
  25.           
  26.         // 記録フォーマットを3GPPに設定  
  27.         mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);  
  28.           
  29.         // 音声コーデックをAMR-NBに設定  
  30.         mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);  
  31.           
  32.         // 出力ファイルパスを設定  
  33.         mRecorder.setOutputFile("/sdcard/audio_sample.3gp");  
  34.           
  35.         try {  
  36.          // レコーダーを準備  
  37.          mRecorder.prepare();  
  38.            
  39.         } catch(IllegalStateException e) {  
  40.          e.printStackTrace();  
  41.            
  42.         } catch(IOException e) {  
  43.          e.printStackTrace();  
  44.         }  
  45.     }  
  46.    
  47.  public void onClickRecordingButton(View view) {  
  48.     
  49.   Button recordButton;  
  50.   recordButton = (Button) findViewById(R.id.recodingButton);  
  51.     
  52.   // 録音状態判定  
  53.   if(!mRecordingFlag) {  
  54.    // 録音開始  
  55.    mRecorder.start();  
  56.    // ボタンテキスト変更  
  57.    recordButton.setText("■");  
  58.    // フラグを変更  
  59.    mRecordingFlag = true;  
  60.   } else {  
  61.    try {  
  62.     // 録音停止  
  63.     mRecorder.stop();  
  64.     // 再使用に備えてレコーダーの状態をリセット  
  65.     mRecorder.reset();  
  66.     // ボタンテキスト変更  
  67.     recordButton.setText("●");  
  68.     // フラグを変更  
  69.     mRecordingFlag = false;  
  70.       
  71.    } catch(IllegalStateException e) {  
  72.     e.printStackTrace();  
  73.    }  
  74.   }  
  75.     
  76.     
  77.  }  
  78.    
  79.  @Override  
  80.  protected void onDestroy() {  
  81.   super.onDestroy();  
  82.   // 使わなくなった時点でレコーダーリソースを解放  
  83.   mRecorder.release();  
  84.  }  
  85.    
  86. }  

1 件のコメント: