AudioRecordのread時に出るbuffer overflowについて

3,233 views
Skip to first unread message

はち

unread,
Jul 1, 2010, 12:18:34 AM7/1/10
to 日本Androidの会

いつもお世話になっています。
AudioRecordのread時に出るWARN( buffer overflow )について
ご教授頂けませんでしょうか。

-----------------------------------------------------------------------------------------------------------------------
this.m_audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
8000,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
512 * 2);

this.m_audioRecord.setPositionNotificationPeriod(512);
this.m_audioRecord.setNotificationMarkerPosition(8000);

onPeriodicNotification内で、

this.m_audioRecord.readを行い
LogCatを見ると

WARN/AudioFlinger(31): AudioRecordThread: buffer overflow
と記述されています。

上記内容のWARNを取り除く方法を、
ご教授頂けませんでしょうか。

宜しくお願い致します。

ohisamallc

unread,
Jul 1, 2010, 1:40:59 AM7/1/10
to android-g...@googlegroups.com
山形のohisamaです。
山形は、晴れてます。
いま、いじってました。

AudioRecord.getMinBufferSizeでバッファサイズ求めてくれます。
setNotificationMarkerPositionはバッファの半分に設定。
たぶん録音でしょう。
onPeriodicNotificationでバッファreadしてFileOutputStreamに
writeします。
再生は、AudioTrackですよ。

> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られ

> います。
> このグループに投稿するには、android-g...@googlegroups.com にメール

> 送信してください。
> このグループから退会するには、
> android-group-j...@googlegroups.com にメールを送信してくださ

> 。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja

> らこのグループにアクセスしてください。
>
>
>

はち

unread,
Jul 1, 2010, 2:58:08 AM7/1/10
to 日本Androidの会
山形のohisamaさん

お返事ありがとうございます。

お指摘の通り録音です。
AudioRecord.getMinBufferSizeで求めたサイズをAudioRecordに指定し、
その半分をsetNotificationMarkerPositionに指定しましたが、
状況は変わりませんでした。

念のため、確認させて下さい。
AudioRecordにセットするバッファサイズは、
AudioRecord.getMinBufferSizeで求めたサイズでないといけませんでしょうか。
Documentに、
Returns the minimum buffer size required for the successful creation
of an AudioRecord object.
と記述がありましたので、getMinBufferSizeより大きければ大丈夫と認識しています。

お手数をお掛け致しますが、
宜しくお願い致します。

ohisamallc

unread,
Jul 1, 2010, 3:44:12 AM7/1/10
to android-g...@googlegroups.com
山形のohisamaです。
ご指名ですので。

概念だけ。
AudioRecordは、マイクの音をPCM化してます。
それをバッファに貯めてます。
readでバッファから取り出します。バッファは空になります。
バッファからは、あふれる前に取り出します。
問題はバッファの大きさじゃなくて、取り出すタイミングです。
setNotificationMarkerPositionがその条件です。
readの戻り値は、たしかカウントです。
その値みれば、何かわかるかも。
Logとかprintlnとか、使えますよね。

Kozo Aono

unread,
Jul 1, 2010, 3:57:51 AM7/1/10
to android-g...@googlegroups.com
はち様

このエラーメッセージは,AudioFlinger.cppで生成しています。
内容的には,オーディオデバイスからデータの読込み(read)が完了したので,再度
readを行なおうとしたのですが,バッファが用意されていないので発生しています。
したがって,原因はAudioTrackがMICデバイスからread時に使用できるバッファが無
かったことが原因です。
いろいろな原因が考えられます。

1. そもそもバッファが小さすぎる
 AudioTrackが所定のバッファに読み込んだのでNotificationを送った。
 それでもAudioTrackは読込みを続けています。
 アプリがNotificationを受け取って,処理しようとしたときにはすでにバッファを
 使い切っていた可能性があります。
 この場合は,バッファ長を大きくすることで回避できます。

2. Notificationで指定したバッファが小さすぎる
 MICは,最低限のブロック長でアクセスします。
 Notificationで指定する長さは,getMinBufferSize()以上をお勧めします。

3. その他
 ほかに,CPUを使用するアプリが稼動していて,このアプリが動けなかったとか。

おまけ
 AudioRdcordの紺とすら区たでのサイズ指定はバイト長ですが,Notificationの指
定はFrame長です。このあたりの指定は問題ありませんか。

AudioRecordでのサイズ指定は,最小値以上でなければ失敗します。この最小値は
getMinBufferSize()で求められます。
最小値以上であれば問題ありません。

Aono

-----Original Message-----
From: android-g...@googlegroups.com
[mailto:android-g...@googlegroups.com] On Behalf Of はち

Sent: Thursday, July 01, 2010 3:58 PM
To: 日本Androidの会

山形のohisamaさん

お返事ありがとうございます。

お指摘の通り録音です。
AudioRecord.getMinBufferSizeで求めたサイズをAudioRecordに指定し、
その半分をsetNotificationMarkerPositionに指定しましたが、
状況は変わりませんでした。

お手数をお掛け致しますが、
宜しくお願い致します。


> て
> > います。
> > このグループに投稿するには、android-g...@googlegroups.com にメー

> を
> > 送信してください。
> > このグループから退会するには、
> > android-group-j...@googlegroups.com にメールを送信してくだ

> い
> > 。
> > 詳細については、http://groups.google.com/group/android-group-japan?hl=ja
> か
> > らこのグループにアクセスしてください。

--


このメールは Google グループのグループ「日本Androidの会」の登録者に送られて
います。
このグループに投稿するには、android-g...@googlegroups.com にメールを

はち

unread,
Jul 1, 2010, 7:12:35 AM7/1/10
to 日本Androidの会
山形のohisamaさん、
Kozo Aonoさん

お世話になっております。
AudioRecordのバッファサイズを大きくすることで、
解決できそうです。

read後のカウントなど確認しながら、
見ていましたら、
read後の処理に時間がかかり、
AudioTrack内のバッファがオーバーフローしていたように、
見受けられますし、再現も確認できました。

あと、Notificationで指定する長さも、短かったです。

お忙しいところ、ありがとうございました。
失礼致します。

Lewske Wada

unread,
Jul 1, 2010, 7:17:35 AM7/1/10
to android-g...@googlegroups.com
On Jul 1, 2010, at 8:12 PM, はち wrote:
AudioRecordのバッファサイズを大きくすることで、
解決できそうです。
read後のカウントなど確認しながら、
見ていましたら、
read後の処理に時間がかかり、
AudioTrack内のバッファがオーバーフローしていたように、
見受けられますし、再現も確認できました。

再生するの実時間だもんね.
何ミリ秒分ぐらいみればいいんだろう.

Cheers,
Lewske "Ryu" Wada
Web: http://run.sh/
Email: r...@run.sh
ICQ: 348990359


Kozo Aono

unread,
Jul 1, 2010, 7:51:17 PM7/1/10
to android-g...@googlegroups.com

Ryu

 

 

Androidフレームワークは,AudioTrackWarinig出力後,5ミリ秒待ってからreadを再試行します。

再試行してもバッファが用意できないと,録音が途切れることになります。

ハード的な要因もありますが,このあたりが限度ではないでしょうか。

 

なお,Androidはガーベージコレクションが稼動すると簡単に数十ミリ秒~数百ミリ秒スレッドを停止してしまい,

この警告がでることがあります。

これに関しては,Androidのバージョンアップに期待するしかないのかもしれません。

 

Aono

 

 


--
Reply all
Reply to author
Forward
0 new messages