3

Android デバイスのマイクから非常に正確な時間の録音を取得しようとしています。私の考えは次のようなものでした

while (true) {
  audioRecord.startRecording();
  sleep(0,nanoSeconds);
  audioRecord.flush();
  audioRecord.read(buf, 0, numSamples);
}

しかし、のflush()方法はありませんAudioRecord。だから多分私はするべきです

while (true) {
  sleep(0,nanoSeconds);
  audioRecord.startRecording();
  audioRecord.read(buf, 0, numSamples);
  audioRecord.stop();
}

もちろん、startRecording()read()、およびstop()が実際にバッファについて話している場所まで十分に詳細に説明されているドキュメントを見つけることはできません。バッファにサンプルがあるかどうかを教えてくれるメソッドはないようです。または、既存のすべてのバッファーを読み取る read() 呼び出しを作成できます。読み取るサンプル数を指定する必要があり、それらのサンプルが存在するまで呼び出しがブロックされます。

これがより真に文書化されている場所を誰かに見せてもらいたいです。しかし、ほぼ同じように、非常に正確に決定された開始時間にマイクを開始しようとしている場合はどうすればよいか教えてください.

4

2 に答える 2

1

この場合、ソースコードはおそらくドキュメントよりも役立ちます。Androidのメディアクラスのほとんどは、ネイティブコードの薄いラッパーです。たとえば、メソッドメソッドはJNIレイヤーを呼び出すだけでstartRecording()android_media_AudioRecord_start() JNIレイヤーはstart()ネイティブAudioRecordインスタンスを呼び出します。AudioFlingerそれを超えて、それは、そして最終的にはハードウェアドライバーとインターフェースします。ハードウェアの待ち時間はデバイスによってほぼ確実に異なり、コンポーネントは通常、高精度の作業用に設計されていません。

そうは言っても、アプリが実行されるハードウェアについていくつかの仮定を立てることができれば、上記のリンクされたネイティブコードを読むことが役立つ場合があります。また、C ++(JNI)コードを少し書くことに慣れている場合は、のインスタンスを操作してオーディオバッファーにアクセスできますAudioRecord。幸運を!

于 2012-10-31T00:11:42.010 に答える
0

API レベル 24 以降、キャプチャ パイプラインで利用可能な最も早い時点で、フレーム配信情報について AudioRecord.getAudioTimestamp() を呼び出すことができます。したがって、記録を開始した後のタイムスタンプを比較して、スリープ間隔が異なるかどうかを確認できます。

詳細については、ドキュメントを参照してください。

于 2016-10-09T20:48:14.870 に答える