質問

組み込みのマイクからオーディオを録音し、そのオーディオデータを処理のためにサーバーに送信する必要があるiPhoneアプリケーションを作成しています。

アプリケーションはソケット接続を使用してサーバーとオーディオキューサービスに接続して録音を行います。私が確信していないのは、実際にデータを送信する時期です。オーディオキューサービスは、いくつかのオーディオデータでバッファに入力されるたびにコールバックを発射します。 NSOUTPUTSTREAMは、スペースを利用できるたびにイベントを発射します。

私の最初の考えは、オーディオキューコールバックでサーバーにデータを送信することでした。しかし、NSOUTPUTSTREAMにその時点で利用可能なスペースがない場合、これは問題になるようです。

次に、データをオーディオキューから戻し、NSOUTPUTSTREAMが利用可能なスペースを発射するたびに一部を送信するときに、データをバッファリングすることを考えました。しかし、これは、サーバーへの送信がオーディオ録音の前に進むと問題があるように思われます。そのため、利用可能なイベントに書くものは何もない状況があるので、イベントは再び起動されません。効果的に失速します。

それで、これを処理するための最良の方法は何ですか?繰り返し発射するタイマーを使用して、利用可能なスペースがあるかどうかを確認する必要がありますか、そして送信する必要があるデータがありますか?また、ネットワークを介してバッファーから大量のデータを取り除くことができるように、スレッドの同期を行う必要があると思います。

役に立ちましたか?

解決

リングバッファーを使用して、バッファが特定のサイズを超えた場合、特定の数のオーディオフレームとドロップフレームを保持できます。 Stream-Has-Space-Available Callbackが呼び出されたら、リングバッファーからフレームを引き出して送信します。

ChdataStructures いくつかのリングバッファ(「円形バッファ」と呼ばれる)クラスを提供します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top