2

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

アプリケーションは、ソケット接続を使用してサーバーに接続し、オーディオキューサービスを使用して録音を行います。私が確信していないのは、実際にいつデータを送信するかです。オーディオキューサービスは、バッファがオーディオデータでいっぱいになるたびにコールバックを起動します。NSOutputStreamは、使用可能なスペースがあるたびにイベントを発生させます。

私の最初の考えは、AudioQueueコールバックでサーバーにデータを送信することでした。ただし、NSOutputStreamにその時点で使用可能なスペースがない場合、これは問題に遭遇するようです。

次に、オーディオキューから返されるデータをバッファリングし、NSOutputStreamが空き領域イベントを発生させるたびにデータを送信することを検討しました。しかし、サーバーへの送信がオーディオ録音よりも進んでいる場合、これは問題があるように思われます。その場合、使用可能なスペースイベントに何も書き込むことができない状況が発生するため、イベントは再度発生せず、データ転送が行われます。事実上失速します。

では、これを処理するための最良の方法は何ですか?繰り返し起動するタイマーを用意して、使用可能なスペースがあり、送信する必要のあるデータがあるかどうかを確認する必要がありますか?また、バッファからデータのチャンクを取り出してネットワーク経由で送信できるようにするだけでなく、バ​​ッファを操作するリスクを冒さずに記録が進むにつれてデータのチャンクをバッファに追加できるように、スレッドの同期を行う必要があると思います。

4

1 に答える 1

3

リングバッファを使用して、特定の数のオーディオフレームを保持し、バッファが特定のサイズを超えた場合にフレームをドロップすることができます。stream-has-space-availableコールバックが呼び出されたら、リングバッファからフレームをプルして送信します。

CHDataStructuresは、いくつかのリングバッファ(「循環バッファ」と呼ばれます)クラスを提供します。

于 2010-03-15T16:53:11.237 に答える