3

私がやりたいのは、音声を録音し、録音したオーディオにエフェクトを追加するように処理してから、openslを使用してできるだけ速く再生することです。このようなことについてネット上で情報を見つけるのに苦労しているので、実際にいくつか質問があります。

androidのネイティブオーディオサンプルと、openslを使い始めたandroid ndkで始まる本を見てきましたが、録音をよく理解するのにあまり役立ちませんでした。

1)最初に、録音されたオーディオをすぐに再生するには、録音スレッドがバッファーに書き込んでいるときに、オーディオを再生するスレッドからバッファーを読み取ることができますか?2つの異なるスレッドによってメモリ内のオブジェクトに同時にアクセスするというアイデアは問題を引き起こす可能性があるため、誰かがこのアイデアに夢中になることはわかっていますが、記録スレッドが常にメモリに書き込むようになっている場合は、オーディオスレッドを再生すると、それは可能でしょうか?

2)または、リアルタイムで再生するには、2つまたは3つの非常に小さいバッファーを含むバッファーキューと、1つがいっぱいになるたびに呼び出されるコールバックを使用し、次のバッファーが録音によっていっぱいになる間にそのバッファーを再生しますか?オーディオスレッド?しかし、私は読んでいて、誰かがコールバックが常に呼び出されるとは限らないと言いました(これについて私が見つけた最も役立つリンクは:https ://groups.google.com/forum/#!msg / android-ndk / hLSygQrmcPI / qtwB76JNa_EJ ) 。また、録音されたオーディオと再生されたオーディオの時間差は、バッファのサイズに、コールバックが次のバッファを使用して録音を開始することを録音オブジェクトに通知するのにかかる時間を加えたものになることを意味します。レコーダーが録音を停止してから再開するまでにはギャップがあると思います。

3)androidの記録バッファキューは、理解に問題がある場所でもあります。オーディオを録音するためにAndroidのバッファキューを使用する必要がありますか?または、バッファキューを使用せずにバッファに直接記録することは可能ですか?の明確な方法がSLAndroidSimpleBufferQueueItf実際には機能していないように見えるため、これに問題があります。どうやらそれはバグです。バッファがすでにデータでいっぱいになっていると、バッファを介して記録できないようです。clearメソッドが機能していないように見えるので、キュー内のどのバッファーに記録するかをレコーダーに指示するにはどうすればよいですか?

これは質問することがたくさんあることを知っています、そして私が試したすべてを言ったわけではありませんが、誰かがこれについてある程度の経験を持っていて、私と再生に問題がある他の人のためにいくつかの光を当てることができることを望んでいましたopenslを使用したリアルタイムのオーディオ。

4

2 に答える 2

5

私は探しているものをほぼ正確に見つけました。録音されたオーディオをリアルタイムで再生する方法は、循環バッファー (またはラウンド バッファー) と呼ばれるものを使用することです。基本的には、録音されたオーディオがそこに読み込まれますが、再生されたオーディオは、録音されたオーディオが書き込まれている場所まですべてを読み取ります。

http://audioprograming.wordpress.com/

Android の OpenSL ES は、まだわずかな遅延があるため、「低レイテンシ」を正確にサポートしていませんが、それでも非常にうまく機能し、わずかなエコーのように聞こえます。

于 2013-01-14T14:35:59.803 に答える