這一個真的讓我拉我的頭髮。我寫了一個從CTransformFilter派生的DirectShow轉換過濾器。我從CTransformInputPin派生了一個輸入引腳。當我的輸入引腳的Receive方法被調用時,它將IMediaSample的演示時間記錄到一個文件中。這一切都正常工作,直到我停止圖形並再次啓動(我正在使用MS的graphedt)。大多數時候,再次運行時,沒有問題。但是,每停止一次,我就停止一次,然後再次運行圖表,開始顯示時間爲負值。隨着圖形的運行,它最終增加到零,並且上升到零以上,但它始終趕不上流時間,結果是流時間仍然是每個樣本的展示開始時間的顯着頭部。在DirectShow中的負面演示時間
我用羅技攝像頭Pro 9000和羅技C600攝像頭觀察到了這一點,但沒有與Winbook相機,所以我想知道這是否是羅技問題。在停止並再次運行之後,是否有其他人在視頻IMediaSamples上看到否定呈現時間? (我看過的IMediaSample預卷標誌:它始終是S_FALSE)
UPDATE:
我已經覆蓋CTransformFilter的(實際上,CBaseFilter的),Run方法與此:
STDMETHODIMP MyTransformFilter::Run(REFERENCE_TIME tStart)
{
char buff[1000];
REFERENCE_TIME rTime;
m_pClock->GetTime(&rTime);
sprintf(buff, "Run tstart = %lld, rTime = %lld", tStart, rTime);
Trace(buff); // open my log file, add buff, close my log file
return CTransformFilter::Run(tStart);
}
我用graphedt來啓動圖形,運行10秒,暫停5秒,然後重新開始。這裏的輸出:
Run tstart = 7855978550000, rTime = 7855978450000
Run tstart = 7856030610000, rTime = 7856126960000
兩次通過運行相差5.2秒(大約我暫停的時間)。兩個參考時鐘時間相差14.6秒(約兩次調用之間的總時間)。除了輕微的增加,過濾器圖形管理器增加了傳遞給Run的時間(在第一次調用中爲10 mS),我希望這些在每次調用Run時都幾乎相同。相反,在第二次通話中傳遞給Run的時間比參考時鐘落後大約10秒。我非常感謝幫助理解爲什麼在第二次調用中傳遞給Run的時間與在第二次調用中由參考時鐘返回的時間沒有(幾乎)相同。
更新2:
問題似乎是在羅技版本13.31.1044.0驅動程序。請參閱下面的答案。
我會明白,如果重新啓動的圖上的流時間沒有重新開始在零。每次停止並開始圖形時,流時間從零開始。但是,大約12次中的一次,捕捉過濾器(當它是羅技相機時)在此之前大幅啓動(-15,000,000或更多REFERENCE_TIME單位)。如果沒有別的,我希望捕獲過濾器對其呈現時間和圖形的流時間之間的關係保持一致。 – 2012-04-11 16:56:05
-15M是-1.5秒 - 相當多但仍然屬於上面的第二段。 – 2012-04-11 17:23:08
有什麼我可以做的,以糾正這一點?我試圖將演示時間與流時間進行比較,以便決定是否放棄樣本而不是在我的變換過濾器中處理它。當捕獲過濾器以負值開始時,它始終保持在流組的後面,讓我無法(我知道)決定該樣本是否遠遠落後於我應該放棄的流時間它。 – 2012-04-11 17:43:38