[メモ] AudioRecordを使ったAndroidの録音方法

以前制作していたアプリで修正が入り、もう一度詳しいところまで調べなおしたので、それのまとめメモ。

Androidで、マイクから録音して、そのデータを再生するアプリを作っていました。
で、こうした処理をする時に肝となるのがAudioRecordクラスの

setNotificationMarkerPosition(int markerInFrames)
setPositionNotificationPeriod(int periodInFrames)
setRecordPositionUpdateListener(AudioRecord.OnRecordPositionUpdateListener listener)

の、3つの関数に対する設定値とその処理。

当初、なんとなくで設定して動いていたものの、サンプリングレートを変更すると動かなくなる、といった良く分からない状況が続いていたというか、今も続いているんですが、一応、それなりの相関関係がまとめられそうになってきたのでメモとして残しておきます。

はじめに書いておきますが、私自身、これでOKと言えるのかどうかは分かりません。
おおむね、この設定で行けば動いている、ということです。
むしろ「本来こうするのが正しい」という値を御存知の方がいましたら、ぜひ、教えてください。

私が当初苦戦していた痕跡を確認されたい方はこの辺りをご確認ください。

  1. AudioRecordクラスを使った音声入力について

  2. 音声入力について



そして上記の他、今回新たにこのページを参考にしながら、色々試した結果なんとなく分かってきたのが

1.setNotificationMarkerPosition にはサンプリングレートの値を設定。
2.setPositionNotificationPeriod には、ログオンデータを取得するための領域として確保する、フレームサイズの半分を使用。(ただし、当然ながらこの値はAudioRecord.getMinBufferSize で取得される値より大きい必要有)
3.setRecordPositionUpdateListener で設定した OnRecordPositionUpdateListener では、 onMarkerReached 関数内では何も処理を行わず、 onPeriodicNotification 関数内で read 処理を行う。このとき、 read するのは onPeriodicNotification が引数として受け取る AudioRecord に対して行う。

という3点です。

一応、この3点の関連性を保持しておけば、たとえばサンプリングレートを半分にした時には連動してフレームを半分にすれば、正常に動いているように見えるようにはなりました。

同じような処理をするアプリを書くことが今後もあるかどうかは分からないけど、この手の処理を行うサンプルがあまり見当たらなくて結構困ったので、誰かの助けにでもなればと言う事で。

あ、ちなみに私のテスト環境はAndroid 4.2のJerry Beansで、実行端末は開発ボードのODROID-Xです。


では。

=======================気になる情報

360度のストリーミング映像をスマホやパソコンで見られるカメラ「Bublcam」

どんなお尻にもフィットして科学的に快適であることが証明されているサドル「Infinity Seat」

アップル、3Dセンサ開発企業PrimeSenseを3億4500万ドルで買収か


Making Musical Apps: Real-time audio synthesis on Android and iOS
O'Reilly Media
2012-02-17
Peter Brinkmann

amazon.co.jpで買う
Amazonアソシエイト by Making Musical Apps: Real-time audio synthesis on Android and iOS の詳しい情報を見る / ウェブリブログ商品ポータル












Repeater
Prestige Worldwide Games

ユーザレビュー:

amazon.co.jpで買う
Amazonアソシエイト by Repeater の詳しい情報を見る / ウェブリブログ商品ポータル

この記事へのコメント

この記事へのトラックバック

テーマ別記事