2014-12-22 39 views
-1

這是工作好,我得到壓縮視頻DirectShow的IMediaSeeking位置總是返回0

 (graph as IMediaFilter).SetSyncSource(null).Check(); 
         IMediaControl mc = graph as IMediaControl; 
         mc.Run().Check(); 

但這IMediaSeeking位置始終返回0,爲什麼?

(graph as IMediaFilter).SetSyncSource(null).Check(); 
IMediaControl mc = graph as IMediaControl; 
IMediaSeeking ms = mux as IMediaSeeking; 
mc.Run().Check(); 

long length; 
ms.GetDuration(out length).Check(); 
long pos; 
while (ms.GetCurrentPosition(out pos).Succeeded() && pos < length) 
{ 
    //this pos always 0 
} 
+0

也許這個'IMediaSeeking'實現(在這個多路複用器過濾器上)不是報告位置,或者它沒有正確報告它。 –

+0

爲什麼?這是所有標準 gb.SetOutputFileName(DShowIDs.MEDIASUBTYPE_Avi, dest_file,out mux,out sink).Check(); gb.RenderStream(null,null,overlay_filter,compressor,mux).Check(); –

回答

0

從官方文檔IMediaSeeking::GetCurrentPosition

過濾器圖表管理器計算從當前流時的位置;它不會查詢圖中的過濾器。對於文件播放,這會產生準確的結果,因爲播放與流時間同步。對於文件編寫,結果不準確。要獲取文件寫入圖形中的當前位置,請查詢多路複用器過濾器。 (然而,位置與實況捕捉無關。)

什麼是您的渲染器過濾器?你渲染到一個文件?如果是這樣,您需要查詢多路複用器過濾器。

您可能已經知道這一點,但您不應該使用當前位置邏輯來決定圖表是否已完成 - 您需要等待EC_COMPLETE事件(例如)。

+0

他正在做'mux作爲IMediaSeeking;',這是使用多路複用器,這是關於正確/可以理解的,但他有興趣獲得更多的細節,尤其是圖拓撲。也許它是複雜的特定問題。 –

+0

哎呀,誤解了代碼。 – persiflage