2009-01-15 28 views
2

我有一個DirectShow圖形與SampleGrabber過濾器做一些處理。處理過程最多需要50ms,因此播放速度通常較慢。處理可以打開和關閉。如何在使用laggy濾鏡時避免DirectShow圖形幀聚集起來?

我的問題是,如果處理已開啓一段時間,當我關閉它時,視頻會盡可能快地播放,直到它達到某個點。據推測,這一點是幀時間與流時間相匹配,並且不再有任何滯後。

我該如何阻止這種情況的發生,以便在關閉處理時以正常速度播放?處理數據時可以關閉流時鐘嗎?或者可能再次從SampleGrabber過濾器中抽取樣本,並添加額外的滯後時間?

有誰知道正確的方式做到這一點?

編輯:

我作爲顯示在下面的答案改變採樣時間的方法,但是有一些問題,尋求和計算樣品時間戳。

我發現一個更好的方法是實現我自己的參考時鐘,並在處理時間過長時停止時鐘。

+0

刪除我的答案,因爲我不認爲這真的有幫助 – 2009-01-15 04:25:40

+0

yea無後顧之憂,感謝您的閱讀。 – geometrikal 2009-01-15 04:30:19

回答

0

只要您使用ISampleGrabberCB::SampleCB而不是ISampleGrabberCB::BufferCallback您可以簡單地使用IMediaSample::SetTime將IMediaSample演示時間戳更新爲任何您想要的值。你需要使用SampleCB,因爲它給你一個指向實際樣本的指針,而BufferCB在你得到它們之前複製這些樣本,這意味着你只是更新副本。

關閉時鐘可能不會幫助你,因爲它只會使圖運行得儘可能快。您可以嘗試使用IMediaSeeking::SetRate來更改回放速率,但請記住,許多濾鏡不支持速率更改。您也可以實施一個自定義時鐘,根據您的具體要求進行調整。

相關問題