1

ffmpeg を使用してビデオ/オーディオ ストリームをデコードし、portaudio を使用してオーディオを再生します。portaudio で同期の問題が発生しました。私は以下のような機能を持っています、

double AudioPlayer::getPlaySec() const  
{  
    double const latency = Pa_GetStreamInfo( mPaStream )->outputLatency;  
    double const bytesPerSec = mSampleRate * Pa_GetSampleSize( mSampleFormat ) * mChannel;  
    double const playtime = mConsumedBytes / bytesPerSec;  
    return playtime - latency;  
}  

mCousumeBytes は、portaudio コールバック関数でオーディオ デバイスに書き込まれたバイト数です。バイト数に応じて再生時間を取得できたと思いました。実際、他のプロセス (open firefox など) を実行して CPU をビジー状態にすると、オーディオが断続的になりますが、mConsumeBytes が予想以上に大きくなり、getPlaySec が再生時間よりも長い時間を返すため、コールバックは停止しません。
これがどのように起こったのかわかりません。どんな提案でも大歓迎です。ありがとう!

4

2 に答える 2

2

PortAudio のレイテンシは、少しあいまいに定義されています。データをバッファに入れてから再生できるまでの平均時間のようなものです。これは、この目的で使用したいものではありません。

代わりに、デバイスの現在の再生時間を見つけるために、実際にPa_GetStreamTime関数を使用してデバイスをポーリングできます。

詳細については、このドキュメントを参照してください。

于 2013-01-02T01:45:56.327 に答える
0

私はこれが古いことを知っています。それでも; PortAudio v19+ は、独自のサンプル レートを提供できます。実際のサンプルレートの再生はハードウェアによって異なる可能性があるため、オーディオ同期にはこれを使用する必要があります。PortAudio は補正を試みる場合があります (実装によって異なります)。ドリフトの問題がある場合は、それを使用してみてください。

于 2017-09-28T19:16:01.423 に答える