2011-10-25 93 views
0

感謝羅馬R對我以前的問題的回答,我現在有一個異步過濾器包裝第三方解碼器庫。如何在解碼器過濾器中創建時間戳?

編碼的輸入樣本來自網絡源。目前我沒有給解碼後的幀添加時間戳,所以幀速率非常不穩定,因爲它取決於數據包的接收時間。

當庫解碼完整幀時,它還根據源編碼器上的時鐘提供捕獲幀的時間的UTC時間戳。

問題是:我如何將它與流時間相關聯併爲SetTime函數創建合理的值?我已經玩過它了,但是我放入的任何值似乎都鎖定了CBaseOutputPin :: Deliver函數中的過濾器圖形。

回答

0

最簡單的時間標記如下。您將第一個媒體樣本的時間標記爲零(請參閱下一段中的調整說明),以下內容將加以區分。也就是說,您開始流式傳輸並從網絡源獲得第一個樣本,您還記得這一次UTC0並將零附加到DirectShow媒體樣本。以下幀1,2和N與UTC時間UTC1 ... UTCN並將轉換爲DirectShow時間UTCN - UTC0。你可能需要額外的轉換爲正確的單位,因爲DirectShow將需要100 ns的單位,而你的網絡資源可能會給你1/90000秒的東西。由於您的源代碼可能是直播源,並且您的第一幀可能不是在圖形運行時精確獲取的,因此您可能正在使用當前過濾器圖形的IReferenceClock::GetTime與收到的時間之間的差異來調整結果媒體採樣時間戳,以致電IBaseFilter::Run

+0

謝謝。我沿着這些線嘗試了一些東西,但我使用了IReferenceClock :: GetTime的當前值,而不用減去IBaseFilter :: Run中的時間。我認爲這導致我的過濾器鎖定,因爲GetTime返回的值可能是系統時間,而不是過濾時間。是正確的嗎? –

+0

是的,這個值不是零對齊的,所以你可能安排你的數據在長時間延遲後播放。 –

+0

謝謝。我會在早上再去一次。 –