2016-04-07 13 views
4

私はVoIPアプリケーションを開発しており、20 msごとにサーバーから送信されるRTPパケットからデータを再生する必要があります。iOS:オーディオユニットを使用してRTPパケットを再生する

私は、RTPパケットからのサンプルを蓄積するバッファを持っています。オーディオユニットのレンダリングコールバックは、このバッファからデータを読み取ります。

問題は、オーディオユニットとRTPストリームを同期できないことです。推奨されるIOバッファの長さは、正確に20ミリ秒に設定することはできません。また、レンダリングコールバックによって要求されたフレーム数も、パケットのサンプル数に設定することはできません。

結果として、2つの可能な状況(サンプルレートとIOバッファ時間に応じて)があります。

a)はオーディオユニットが速く、それがRTPパケットから充填されているよりも私のバッファから読み出します。この場合、バッファは定期的に要求されたサンプル数を含んでおらず、歪んだサウンドが得られます。

b)バッファは、オーディオユニットの読み込みよりも速く埋められます。この場合、バッファは周期的にオーバーフローし、新しいRTPパケットからのサンプルは失われます。

この問題を回避するにはどうすればよいですか?

答えて

1

パケットレートを制御できる場合は、通常、「リーキーバケット」アルゴリズムによって行われます。循環FIFO /バッファは、着信データの「バケット」を保持することができ、ネットワーク速度および待ち時間の変動をカバーするために、ある程度のパディングをFIFO /バッファに保持する必要があります。バケツがいっぱいになると、パケットの送信者にスローダウンなどを依頼します。

オーディオの再生終了時には、さまざまなオーディオコンシールメント方法(PSOLAタイムピッチの変更など)を使用してわずかに伸縮させることができます適切なバッファ充填閾値を超えた場合に適合するデータ。

+0

ありがとうございました! PSOLAまたはWSOLAのc/C++オープンソース実装があるかどうか教えてください。 –

+0

これは別の質問です。ここで話題にはならないので、dsp.stackexchangeで質問してください。 – hotpaw2

+0

私は循環遅延バッファとwsola圧縮/展開を実装しました。そしてそれは動作します! –

1

あなたは、オーディオ

を受信して​​いる場合、クライアントを持ってみ自動的に定期的に(例を。毎秒)を要求するサーバがバッファサイズと接続速度に依存し、特定のビットレートの音声を送信します。

たとえば、バッファに20サンプル、速度が15000kbit/sで、必要に応じてオーディオサンプルのビットレートを動的に増減させると、各オーディオサンプルは300kbits大きくなります。

オーディオを送信する場合

同じですが逆の操作を行います。クライアントがオーディオのビットレートを変更することをサーバーに定期的に要求させます。

+0

速い返信ありがとう!ストリームフォーマットの異なるmBytesPerFrameパラメータを使用してAudio Unitを再起動する必要があることを意味しますか?やってみます! –

+0

いいえフレームごとのバイトを変更しないでください。 – hotpaw2

関連する問題