7

public int read(byte [] audioData、int offsetInBytes、int sizeInBytes)。

このメソッドは、オーディオハードウェアからオーディオデータを読み取り、バッファに記録します。

そのパラメータは次のとおりです。audioData録音されたオーディオデータが書き込まれる配列。データが書き込まれるaudioDataのoffsetInBytesインデックスはバイト単位で表されます。sizeInBytes要求されたバイト数。

読み取られたバイト数、またはオブジェクトが適切に初期化されていない場合はERROR_INVALID_OPERATIONを返し、パラメーターが有効なデータとインデックスに解決されない場合はERROR_BAD_VALUEを返します。バイト数はsizeInBytesを超えません。

私はこのメソッドを次のようにコードで記述しました:int num; byte [] buf = new byte [160]; num = record.read(buf、0、160);

問題は、データが利用できない場合でも、常に160(つまり、読み取られるように要求されたバイト)を返すことです。どうしたの?助けて。前もって感謝します。

4

2 に答える 2

15

更新: Android のこのバグは、4.2.2 以降および 5.01 以前のどこかで修正されました。5.01 では、コールバックはドキュメントに記載されているとおりに機能します。

read開発者の近視眼のためにブロックされているようです。

基本的に、オーディオ レコーダーが初期化されると、一種のリング バッファーが割り当てられます.start()

次に.read()が呼び出されると、バッファー サイズ (または要求されたサイズのいずれか小さい方) の半分まで読み取り、戻ります。

1000 個のサンプルを読み取りたいが、使用可能なサンプルが 900 個しかない場合、戻る前にさらに 100 個のサンプルを待機する必要があります。ただし、1000 を超えるサンプルがある場合は、それらを即座に読み取り、すぐに戻ります。

理想的には、非ブロッキング読み取りを提供して、利用可能なものはすべて返されるか、完全な読み取りに相当するデータがいつ利用可能になるかを知る方法を提供して、非ブロッキング読み取りを実行できるようにします。

彼らが最初のものをサポートしているとは思わない。set period コールバック メソッドを使用して秒をサポートしようとしているように見えますが、これまでのところ、迅速なノンブロッキング読み取りを実行するための正しいタイミングでコールバックを取得できません。

ネイティブ C++ ソース コードの完全なソース (8.5G バイト) を複製し、すべてのレイヤーで機能を追跡して、どのように機能するかを確認しようとしています。

非ブロッキング.read(0)ing の秘訣は、完全な読み取りに相当するサンプルの準備が整ったときにのみ読み取ることです。しかし、その条件がいつ真であるかを判断することは、私がまだ理解していないことです.

参照: ネイティブ C++ 関数を呼び出す .read() の Java コードは次のとおりです。

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.4_r1/android/media/AudioRecord.java#AudioRecord.read%28java.nio.ByteBuffer% 2Cint%29

上記の read() メソッドは、次の場所にあるネイティブnative_read_in_direct_buffer()を呼び出します。

http://pdroid.googlecode.com/svn/android-2.3.4_r1/trunk/frameworks/base/core/jni/android_media_AudioRecord.cpp

(私が知る限り)どの呼び出しまたはポイントがandroid_media_AudioRecord_readInByteArray()順番に呼び出さAudioRecord.read()れ、この関数には do/while ループがあり、必要なバイト数が読み取られるまで (またはバッファーサイズの半分、frameworks/base/media/libmedia/frameworks/base/media/libmedia/AudioRecord.cpp小さい方。)

私はコールバックをうまく機能させようとしましたが、 read() が戻る前にオーディオバッファがいっぱいになるのを待たなければならないときにのみコールバックするようです-それで、ポイントは何ですか.

私の次の目標は、通知コールバックのソース コードを突き止めて、それがいつ何をするのかを正確に推測できるようにすることです。

于 2013-04-03T07:07:44.427 に答える
8

readブロッキング方法です。読み取るように指示したバイト数を読み取った後、またはストリームが閉じられている場合、またはストリームが使用可能なデータがこれ以上ないことを示している場合 (たとえば、ファイルの読み取り時) にのみ返されます。

AudioRecord は連続ストリームであるため、「利用可能なデータがこれ以上ない」場合は適用されません。

于 2011-01-01T05:09:36.680 に答える