音声データを録音するには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(); } }
XML書いてない
返信削除