内蔵マイクからの音声を録音し、その音声データをサーバーに送信して処理する必要があるiPhoneアプリケーションを作成しています。
アプリケーションは、ソケット接続を使用してサーバーに接続し、オーディオキューサービスを使用して録音を行います。私が確信していないのは、実際にいつデータを送信するかです。オーディオキューサービスは、バッファがオーディオデータでいっぱいになるたびにコールバックを起動します。NSOutputStreamは、使用可能なスペースがあるたびにイベントを発生させます。
私の最初の考えは、AudioQueueコールバックでサーバーにデータを送信することでした。ただし、NSOutputStreamにその時点で使用可能なスペースがない場合、これは問題に遭遇するようです。
次に、オーディオキューから返されるデータをバッファリングし、NSOutputStreamが空き領域イベントを発生させるたびにデータを送信することを検討しました。しかし、サーバーへの送信がオーディオ録音よりも進んでいる場合、これは問題があるように思われます。その場合、使用可能なスペースイベントに何も書き込むことができない状況が発生するため、イベントは再度発生せず、データ転送が行われます。事実上失速します。
では、これを処理するための最良の方法は何ですか?繰り返し起動するタイマーを用意して、使用可能なスペースがあり、送信する必要のあるデータがあるかどうかを確認する必要がありますか?また、バッファからデータのチャンクを取り出してネットワーク経由で送信できるようにするだけでなく、バッファを操作するリスクを冒さずに記録が進むにつれてデータのチャンクをバッファに追加できるように、スレッドの同期を行う必要があると思います。