2013-01-01 178 views
0

我使用ffmpeg解码视频/音频流并使用portaudio播放音频。我遇到与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回调函数的字节数。我想我可以根据字节数得到播放时间。实际上,当我执行使CPU繁忙的其他进程(如开放式Firefox)时,音频变得间歇性,但回调不会停止,因此mConsumeBytes超出预期,并且getPlaySec返回的时间大于播放时间。
我不知道这是怎么发生的。任何建议都是值得欢迎的。谢谢!

回答

1

延迟,在PortAudio中有点含糊地定义。就像您将数据放入缓冲区之间的平均时间以及您希望它播放的时间之间的平均时间。这不是你想用于这个目的的东西。

相反,要查找设备的当前播放时间,可以使用Pa_GetStreamTime函数实际轮询设备。

您可能想查看this document了解更多详细信息。

+0

我在我的同步逻辑中发现了一些错误。这不是波特奥迪造成的。但是,您提供了一个很棒的文档!不管怎么说,还是要谢谢你! – Arton

0

我知道这是旧的。但仍然; PortAudio v19 +可以为您提供自己的采样率。您应该将其用于音频同步,因为不同硬件之间的实际采样率回放可能不同。 PortAudio可能会尝试进行补偿(取决于实施情况)。如果你有漂移问题,请尝试使用它。