2012-03-19 36 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系統時間增量。這補償了不準確的有效回放速率。

在捕獲時,硬件本身的行爲就好像按照要求的速率傳輸數據。我認爲您可以做的最好的方法是測量有效速率,並將音頻從有效性再採樣到正確的採樣率。