音声データを録音するにはMediaRecorderを使用します。
このMediaRecorderは順番どおりに使用しないと使えないという厄介な代物。
順番を簡単に書くとこんな感じです。
1.インスタンスを作成
2.入力ソースの設定
3.記録フォーマットを設定
4.音声コーデックを設定
5.出力パスを設定する
6.録音準備
7.録音開始
8.録音の停止
9.レコーダの状態をリセット
10.レコーダリソースを解放
案外手順が多いですね(汗)
というわけで順番に見ていきましょう。
と、まず今回は
マイクからの入力とSDカードの出力を行うのでパーミッションを指定します。
AndroidManifest.xmlに以下を追記します。
- <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
それでは解説いってみます。
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書いてない
返信削除