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()を用いて、入力元を指定します。後は同じです。
コメント