Androidアプリ開発:録音と再生

[投稿日] 2016年11月7日
[最終更新] 2017年2月21日

Android Studio 2.2.2、API Level 15以上にて。マイク入力のサウンドをwavファイルに出力し、録音した音源を同アプリ上で再生します。録音にはMediaRecorder、再生にはMediaPlayerを利用します。

スポンサーリンク

使用するAPI

Androidにおいて、録音に使用できるAPIとしてAudioRecordとMediaRecorderがあります。「Androidで録音 – teruuuのブログ」によれば、AudioRecordは音声情報をリアルタイムに処理するのに、MediaRecorderはファイルへの出力に向いているとのことです。実際、wavファイルに出力する際、AudioRecordは自分でフォーマットに基づいて出力を生成しなければならない一方、MediaRecorderは既にメソッドが実装されており簡便です。また、録音にしてもAudioRecordは細かな設定が必要です。

要は低次の細かい設定が必要な、たとえば音声解析などをしたいときにはAudioRecord、ただ録音したいというだけであればMediaRecorderを使うのが簡単であるということのようです。

今回はできるだけシンプルにwavファイルに録音・再生することを目的とするため、MediaRecorderを用います。また、録音したファイルの再生にはMediaPlayerを用います。Android Studio 2.2.2、エミュレータとしてNexus 6 Android 5.1で動作を確認しました。

公式:MediaRecorder | Android Developers

サンプル音源の再生

まずサンプル音源を再生します。res/raw/sample.wavを再生するときのコードを下記に。

/* 略 */

public class MainActivity extends AppCompatActivity {

    private MediaPlayer mp;

/* 略 */

// 再生
    private void startPlay() {
        mp = MediaPlayer.create(this, R.raw.sample);
        try {
            mp.prepare();
            mp.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

// 停止
    private void stopPlay() {
        try {
            mp.stop();
            mp.prepare();
            mp.release();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

/* 略 */

使用するのは、MediaPlayerのcreate(),prepare(),start(),stop(),release()のみです。

ここでは省略しますが、再生ボタンと停止ボタンを用意して、startPlay();およびstopPlay();を呼び出すようにすれば、res/raw/sample.wavの再生・停止ができます。

録音

次に録音するコードを書きます。まず録音で外部ストレージとマイクを使用するので、AndroidManifest.xmlに以下を記述します。

<?xml version="1.0" encoding="utf-8"?>
<!-- 中略 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
</manifest>

次にコードを書きます。上述の記事「Androidで録音 – teruuuのブログ」を参考にさせていただきました。

/* 略 */

public class MainActivity extends AppCompatActivity {

    private MediaRecorder rec;
/* 録音先のパス */
    static final String filePath = Environment.getExternalStorageDirectory() + "/sample.wav";

/* 略 */

    private void startRecord() {
        /* ファイルが存在する場合は削除 */
        File wavFile = new File(filePath);
        if (wavFile.exists()) {
            wavFile.delete();
        }
        wavFile = null;
        try {
            rec = new MediaRecorder();
            rec.setAudioSource(MediaRecorder.AudioSource.MIC);
            rec.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
            rec.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            rec.setOutputFile(filePath);

            rec.prepare();
            rec.start();
        } catch(Exception e){
            e.printStackTrace();
        }
    }

    private void stopRecord() {
       try {
           rec.stop();
           rec.reset();
           rec.release();
       } catch (Exception e) {
           e.printStackTrace();
       }
    }

/* 略 */

設定しなくてはいけない分、再生と比べるとやや煩雑です。入力元、出力形式、エンコーダの形式、出力先を指定しています。OutputFormatは、デフォルト指定でwav出力できるようなのですが、ドキュメントには記述されていません……。

録音と再生

録音しただけでは動作が確認できないので、、録音したファイルを再生するように、先のstartPlay()を以下のように改変します。

/* 略 */
    private void startPlay() {
        //mp = MediaPlayer.create(this, R.raw.sample);
        try {
            mp = new MediaPlayer();
            mp.setDataSource(filePath);
            mp.prepare();
            mp.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
/* 略 */

create()ではなくsetDataSource()を用いて、入力元を指定します。後は同じです。

関連コンテンツ

関連記事

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。