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 回调函数中写入音频设备的字节数。我以为我可以根据字节数得到播放时间。实际上,当我执行使 cpu 忙碌的其他进程(如 open firefox )时,音频会变得断断续续,但回调不会停止,因此 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 回答