2012-03-19 85 views
1

当你设置声卡率,例如,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的方法来询问关于实际播放样本编号的声卡?

回答

1

这是一个已知的效果,这是例如在Windows解决速率匹配,这里Live Sources描述。

回放时,通常通过使用音频硬件作为“时钟”并同步音频回放而不是“真实”时钟来解决该效果。也就是说,例如,对于音频采样率44100,下一个25fps视频的视频帧与44100/25采样回放同步呈现,而不是使用1/25系统时间增量。这补偿了不准确的有效回放速率。

在捕获时,硬件本身的行为就好像按照要求的速率传输数据。我认为您可以做的最好的方法是测量有效速率,并将音频从有效性再采样到正确的采样率。