音を保存したい時にmediaRecorderクラスと言う、保存に便利なクラスが存在しますが。。
(mediaRecorderについては次あたりに紹介します。)
楽しげなものを作りたいので、今回は生のデータをそのままで保存をしてみたいと思います。
参考:Raw Audio Manipulation in Android
audioRecordクラスを利用します。
初期設定としては
private static final int SOUND_RATE = 44100; int bufferSizeRecord = AudioRecord.getMinBufferSize(SOUND_RATE, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,SOUND_RATE,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.ENCODING_PCM_16BIT,bufferSizeRecord)
上記の設定で音の取得の準備が完了しました。
実行は次の関数です。
short[] bufferRecord = new short[bufferSizeRecord]; audioRecord.startRecoding();
上記で、実行の準備ができました。
次の実際にデータが入ってきた場合の対応をしましょう。
int bufferReadResult = audioRecord.read(bufferRecord,0,bufferSizeRecord);
でbufferRecordの中に配列として、読み込まれたデータが格納されています。
ここで、データの保存の方法ですが、
一時的に保存できる領域が限られているので、SDcardの中に読み込みができる領域を作成します。
尚、この時に保存する形式は今回はpcmと言う保存形式にします。
(非圧縮の形式です。)
もしも、保存できるようにする場合などはディレクトリを作成してもよいかもしれませんが、
今回は、一時保存の領域の為にSDcard直下に作成をします。
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/sound.pcm");
このファイル自体は存在していた場合には上書きの手間がかかるので、
存在する場合には、削除してしまいます。
if(file.exist()){ file.delete(); }
次の新しいファイルを作成します。
file.createNewFile();
このファイルに関しての出力部分でのStreamを作成します。
OutputStream os = new FileOutStream(file);
上記のサイトによると、FileOutStreamは書き込み用のStreamのようです
今回は高速で書き込む必要があるので、このFileOutStream()をbufferに対応できるように変換する。
BufferedOutputStream bos = new BufferOutputStream(os);
このバッファーアウトプットクラスを使う事で、1byteづつではなくバッファーごとに書き込みができるようになるので、一度に入力できるようになりました。
このデータに入れる段階で、音のデータに関しては各々が数値のデータとして取得されているので
バイトに変換できるようにDataOutputStreamとして利用をする必要があります
ByteArrayOutputStream,DataOutputStream – 数値をバイト配列に変換する
DataOutputStream dos = new DataOutputStream(bos);
とします。これで、書き込みができるようになりました。
先ほど作成した、bufferのデータに関してはbufferReadResultの数だけ、書き込みます。
for(int i = 0 ; i < bufferReadResult ; i++){ dos.writeShort(buffer[i]); }
でデータへの書き込みが行えるようになりました。
全てのデータの書き込みが完了した段階で、
audioRecord.stop(); dos.close()
を行いましょう。
上記には説明の簡単の為、割愛させていただいておりましたが、
threadの内部で実行をするイメージです。
while(recording){ int bufferReadResult = audioRecord.read(bufferRecord,0,bufferSizeRecord); for(int i = 0 ; i < bufferReadResult ; i++){ dos.writeShort(bufferRecord[i]); } }
この段階では非圧縮のデータの保存のみなので、
次回、保存したデータの再生方法、また、圧縮形式での保存方法を少し勉強する予定です。
中途半端な感じですが、次回につながる内容にしてみました。