有沒有辦法檢測到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,網絡文件系統緩慢,網絡連接速度慢,解碼器速度慢等。
這就是我到目前爲止所做的。不幸的是,等待可能由於幾個原因失敗(真正的eof,網絡文件系統緩慢,網絡連接丟失,解碼器緩慢等)。 – 2008-11-27 23:43:20