例如,当您将声卡速率设置为 44100 时,您不能保证实际速率等于 44100。在我的情况下,应用程序和 ALSA 之间的流量测量(以样本/秒为单位)给了我 44066...44084 的值。
这不应该与重采样问题有关:即使只有 48000 硬件也必须在“44100”模式下以 44100 速率“吃掉”数据。
当我在播放此波形时尝试在波形上绘制光标时会出现问题。我使用从 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 个样本/秒。然后我在屏幕绘图函数中使用这个值作为实际速率。现在问题消失了。该程序是跨平台的,所以我稍后会在 Windows 和另一个声卡上测试这个测量值。
但是有没有更好的方法来同步声音和屏幕?例如,是否有一些不太消耗 CPU 的方式来向声卡询问实际播放的样本数?