当你设置声卡率,例如,44100,你不能保证实际利率等于44100在应用程序和ALSA之间我的情况下,流量测量(样本/秒)给我的价值44066 ... 44084。采样率偏差和声音播放位置
这不应该与重采样的问题:在“44100”模式在44100率甚至只有-48000的硬件必须“吃”的数据。
的问题,当我尝试绘制光标放在波形,而这种波形播放时。我用从WAV文件读取的 “理想” 的采样率计算光标位置(22050,...,44100,...,48000)和播放开始,使用下面的C++函数后所花的毫秒:
long long getCurrentTimeMs(void)
{
boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
boost::posix_time::ptime epoch_start(boost::gregorian::date(1970,1,1));
boost::posix_time::time_duration dur = now - epoch_start;
return dur.total_milliseconds();
}
QTimer用于为光标动画生成帧,但我不依赖于QTimer精度,因为我通过getCurrentTimeMs()(每个帧足够精确)询问时间,所以我可以使用不同的帧率。
经过2-3分钟的游戏,我发现我听到的和我所看到的有什么不同 - 光标位置大于播放1/20秒左右的位置。
当我测量的流量,通过ALSA的回调走到哪里我都44083.7采样/秒的平均值。然后我在屏幕绘图功能中使用这个值作为实际速率。现在问题消失了。该方案是跨平台的,所以我将在稍后的窗口和另一个声卡上测试这些测量结果。
但是,有没有更好的方式来同步声音和画面?例如,是否有一些非常耗费CPU的方法来询问关于实际播放样本编号的声卡?