當你設置聲卡率,例如,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的方法來詢問關於實際播放樣本編號的聲卡?