2011年5月18日水曜日

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

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

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

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

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

    
    

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

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

    private MediaRecorder mRecorder;

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

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

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

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

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

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

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

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

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

以上で一通りができます。
以下のコードは私が実際にかいたものです。
ボタンを押したら録音を開始します。同じくボタンを押したら終了します。
同じボタンを使用しているのフラグで制御していますよ、と。
import java.io.IOException;

import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class VoiceAcitivity extends Activity {

 private MediaRecorder mRecorder;
 private boolean mRecordingFlag = false;
 
 
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // MediaRecorderのインスタンスを作成
        mRecorder = new MediaRecorder();
        
        // マイクからの入力とする
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        
        // 記録フォーマットを3GPPに設定
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        
        // 音声コーデックをAMR-NBに設定
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        
        // 出力ファイルパスを設定
        mRecorder.setOutputFile("/sdcard/audio_sample.3gp");
        
        try {
         // レコーダーを準備
         mRecorder.prepare();
         
        } catch(IllegalStateException e) {
         e.printStackTrace();
         
        } catch(IOException e) {
         e.printStackTrace();
        }
    }
 
 public void onClickRecordingButton(View view) {
  
  Button recordButton;
  recordButton = (Button) findViewById(R.id.recodingButton);
  
  // 録音状態判定
  if(!mRecordingFlag) {
   // 録音開始
   mRecorder.start();
   // ボタンテキスト変更
   recordButton.setText("■");
   // フラグを変更
   mRecordingFlag = true;
  } else {
   try {
    // 録音停止
    mRecorder.stop();
    // 再使用に備えてレコーダーの状態をリセット
    mRecorder.reset();
    // ボタンテキスト変更
    recordButton.setText("●");
    // フラグを変更
    mRecordingFlag = false;
    
   } catch(IllegalStateException e) {
    e.printStackTrace();
   }
  }
  
  
 }
 
 @Override
 protected void onDestroy() {
  super.onDestroy();
  // 使わなくなった時点でレコーダーリソースを解放
  mRecorder.release();
 }
 
}

1 件のコメント: