我使用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回调函数中写入音频设备的字节数。我以为我可以根据字节数来获得播放时间。实际上,当我执行使cpu忙的其他进程(如open firefox)时,音频变得间歇,但回调不会停止,因此mConsumeBytes超出预期,并且getPlaySec返回的时间大于播放时间。
我不知道这是怎么发生的。任何建议都是受欢迎的。谢谢!
答案 0 :(得分:2)
延迟,在PortAudio中定义有点模糊。类似于将数据放入缓冲区之间的平均时间以及您可以期望它播放的平均时间。这不是你想要用于此目的的东西。
相反,要查找设备的当前播放时间,您实际上可以使用Pa_GetStreamTime功能轮询设备。
您可能希望查看this document以获取更详细的信息。
答案 1 :(得分:0)
我知道这是旧的。但是仍然; PortAudio v19 +可以为您提供自己的采样率。您应该将其用于音频同步,因为不同硬件之间的实际采样率回放可能不同。 PortAudio可能会尝试补偿(取决于实现)。如果您有漂移问题,请尝试使用它。