私はVoIPアプリケーションを開発しており、20 msごとにサーバーから送信されるRTPパケットからデータを再生する必要があります。iOS:オーディオユニットを使用してRTPパケットを再生する
私は、RTPパケットからのサンプルを蓄積するバッファを持っています。オーディオユニットのレンダリングコールバックは、このバッファからデータを読み取ります。
問題は、オーディオユニットとRTPストリームを同期できないことです。推奨されるIOバッファの長さは、正確に20ミリ秒に設定することはできません。また、レンダリングコールバックによって要求されたフレーム数も、パケットのサンプル数に設定することはできません。
結果として、2つの可能な状況(サンプルレートとIOバッファ時間に応じて)があります。
a)はオーディオユニットが速く、それがRTPパケットから充填されているよりも私のバッファから読み出します。この場合、バッファは定期的に要求されたサンプル数を含んでおらず、歪んだサウンドが得られます。
b)バッファは、オーディオユニットの読み込みよりも速く埋められます。この場合、バッファは周期的にオーバーフローし、新しいRTPパケットからのサンプルは失われます。
この問題を回避するにはどうすればよいですか?
ありがとうございました! PSOLAまたはWSOLAのc/C++オープンソース実装があるかどうか教えてください。 –
これは別の質問です。ここで話題にはならないので、dsp.stackexchangeで質問してください。 – hotpaw2
私は循環遅延バッファとwsola圧縮/展開を実装しました。そしてそれは動作します! –