2008-11-27 41 views
2

有沒有辦法檢測到DirectShow filtergraph已經到達其文件末尾?在文件末尾,我的意思是帶有SampleGrabber過濾器的過濾器圖將永遠不會再接收到另一個SampleCB調用。針對DirectShow的eof檢測

這裏有一些事情不工作:

  • 信託IMediaDet::get_StreamLength(它經常說,有一個視頻幀數比真的存在)
  • 信託IMediaSeeking::GetDuration(它與IMediaDet一致,+/- 一幀)
  • 使用IMediaControl::GetState(FilterGraph動態的運行仍然即使所有的幀都已經從文件處理)

背景:

我正在做視頻處理,我有一個類創建一個SampleGrabber的filtergraph。每當調用SampleGrabber::SampleCB時,我都會用一個互斥鎖來阻止它,這樣我就可以在拉模式下運行filtergraph。當我爲另一個框架做好準備時,我會解鎖主線程中的互斥鎖,並等待SampleGrabber::SampleCB向我發送完成信號。對於某些視頻,IMediaDet::get_StreamLength告訴我,視頻的幀數比實際存在的幀數多。一旦我提取了最終幀並且請求了一個比實際存在更多的幀,那麼主線程將永遠阻塞,因爲SampleGrabber::SampleCB將永遠不會再被調用。我希望能夠檢測到SampleGrabber::SampleCB永遠不會被調用文件源。像Windows Media Player這樣的應用程序能夠以某種方式執行此操作,因爲GUI報告視頻在最後一個實際幀後結束,所以顯然有一種方法可以實現此目的。

編輯:

我使用WaitForSingleObject實現主線程阻塞。迄今爲止我一直在使用的解決方法是按照Greg的建議做:有限的超時。不幸的是,這有點棘手。等待可能會失敗,原因很多,比如真正的eof,網絡文件系統緩慢,網絡連接速度慢,解碼器速度慢等。

回答

3

也許使用IMediaEventEx接口?其中一個事件代碼是EC_COMPLETE,記錄爲「來自特定流的所有數據都已呈現」。

1

假設主線程在WaitForSingleObject上被阻塞,您是否可以不指定超時等待?然後,如果等待因爲超時而返回,而不是因爲它已收到信號,則您將知道這是最後一幀。

+0

這就是我到目前爲止所做的。不幸的是,等待可能由於幾個原因失敗(真正的eof,網絡文件系統緩慢,網絡連接丟失,解碼器緩慢等)。 – 2008-11-27 23:43:20