2011-12-01 141 views
2

IMediaSample SetTime()函數需要兩個參數REFERENCE_TIME參數。在Delphi 6中,REFERENCE_TIME被定義爲類型「LongLong」,這是我用於DirectShow應用程序的編程語言。但是,DirectShow採樣器篩選器用於傳遞新媒體採樣的採樣時間的回調方法的第一個參數被設置爲double。如何在這兩個值之間進行轉換,以便我可以比較從採樣採集器過濾器接收的介質採樣與我在推送源過濾器的FillBuffer()方法中生成的REFERENCE_TIME值之間的採樣時間?如何在DirectShow採樣卡和FillBuffer REFERENCE_TIME之間轉換「double」時間戳?

此外,回調方法中採樣採集器過濾器提供的採樣時間是否會被視爲媒體採樣的開始時間或結束時間?

回答

4

簡單部分:double以秒爲單位,而REFERENCE_TIME以100ns爲單位。因此轉換很簡單:多個或除以1E+7

並非如此簡單:您可以在一個過濾器圖形中捕獲一些時間,並且可以在另一個圖形中將過濾器中的數據標記爲時間戳。這兩張圖都有時間戳,表示streaming/presentation time,這與圖表「運行時間」有關。也就是說,當圖形之間傳遞媒體樣本時,可能還會涉及時間戳偏移量。對於結束時間,對於視頻媒體樣本,樣本停止時間可以省略或設置爲等於開始時間;與音頻停止時間通常可以通過添加緩衝區保存的有效載荷數據的開始時間來計算。 MSDN上

獎金閱讀:Time and Clocks in DirectShow

+0

再次感謝。我最終從借用的捕獲濾波器中「借用」採樣時間來驅動整個系統,並將其轉換爲我在推送源濾波器中生成的開始/停止參考時間。 –

0

對我來說也已經有點難以認爲100個納秒爲單位。所以我也經常在毫秒和100納秒之間轉換。儘管編寫自己的函數是非常微不足道的。如果您使用的DirectShow基類的也有文件RefTime.h

在DirectShow的基類中導出的宏這也將完成轉換:

double time = 1000; 
REFERENCE_TIME direct_show_time = MILLISECONDS_TO_100NS_UNITS(time);