如果使用 GetCurrentPosition 將不會是精確的解碼 frame.
因為根據 MSDN IMediaSeeking 的 remark 說明: GetCurrentPosition 取得的是 render filter 的 stream time. 不是 Source Filter 的.
我曾嘗試 override CMediaSeeking 的 GeturrentPosition method, 但是很不幸的是, 當使用者下達 GetCurrentPosition 指令時, 程式的執行根本不會跳到 自己寫的 method, 甚至連 CMediaSeeking class 本身也不會被執行.
那麼, 既然不會被執行, 難道只是為了實作 IMediaSeeking interface 而寫的一個 空殼嗎?
這個問題有待將來有時間後, 再來解決.
然而, 如果只是要實作 Seek bar 跟著 影像播放的進度移動, 使用 DirectShow Tutorial 中 Implementating a Seek Bar 的方法, 確實可行.
如果你像我一樣, 只想利用 Push model 的 Source Filter, 作所有的事情.
那麼
只要注意你在 Filter 設計時, 把 m_rtDuration 設定為整段影像檔的長度即可.
設定的方式可以 override CSourceStream::SetPositions 時,
乘機設定
m_rtDuration=*pStop;
這樣, 使用者在呼叫下面程式碼時
pSeek->GetDuration(&g_rtTotalTime);
才會得到正確的值.
沒有留言:
張貼留言