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