2013-02-27 93 views
0

我寫一個DirectShow源過濾器來讀取特定的原始文件,原始文件包含時間戳(UTC時間)在每一幀DirectShow的源過濾SETTIME

我的過濾器從微軟SDK的修改「推源過濾樣本」 ,所以最重要的是覆蓋GetMediaType(),DecideBufferSize()和FillBuffer()。

我的問題是在FillBuffer(IMediaSample * pSample)中。我不知道如何在此函數中正確調用pSample-> SetTime(),因爲時間戳從大數開始,幀將等到StreamTime達到時間戳。

問題可以通過。減去來解決每個幀上的偏移,但我需要在下游過濾器(SampleGrabber)原始時間戳

是否有更好的解決方案?

回答

0

媒體樣本沒有絕對時間戳。您需要從正在流式傳輸的片段中的所有樣本中減去前導媒體採樣時間,以便第一個媒體採樣爲零,並正確設置以下內容。

如果您可以使您的採樣器回調可用的基準時間戳(您正在減去),那麼您可以將其添加回來並恢復正確的絕對時間。

MSDN:Time Stamps in DirectShow

+0

非常感謝,這聽起來可行的方法,但在實施尋求接口事情會變得複雜。順便說一句 我嘗試使用SetMediaTime()來保存起始時間,但它不起作用(SampleGrabber對GetMediaTime()不正確) – 2013-02-27 09:01:04

+0

是的媒體時間是一種不可靠的,我建議你不要使用它。而是直接從源過濾器獲取基準時間,而不是從媒體樣本的屬性獲取。 – 2013-02-27 09:03:05