2017-08-17 140 views
2

我想要使用DirectShow的媒體文件的幀速率。DirectShow返回錯誤幀速率FPS

目前,我用下面的方法,在某些情況下,似乎不準確:

我添加SourceFilter我的圖表,枚舉它的腳,然後再打一個pPin->ConnectionMediaType(&compressedMediaFormat)進出從中提取AvgTimePerFrame。據我瞭解,每幀的平均時間以100納秒錶示。所以,我只分割10,000,000/AvgTimePerFrame來獲得文件的平均FPS。

對於所有幀具有幾乎相同幀時間的媒體文件,我得到正確的FPS。但對於那些對不同幀有不同幀時間的幀,此方法返回非常不準確的結果。

正確的方法是獲取文件的持續時間和幀數,並計算出平均FPS(frameCount/duration)。然而,這是一個代價高昂的操作,因爲計算確切的幀數需要通過整個文件。

我不知道是否有辦法更準確地獲得幀頻信息?

回答

2

媒體文件不一定是固定的幀速率,一般來說 - 可能會有變化的幀速率。文件的元數據仍然有一些幀速率相關的信息,在這種情況下,這可能是不準確的。當您開始訪問文件時,您可以快速獲取有關幀速率的元數據信息。的確,爲了獲得完整的圖像,你應該讀取所​​有幀並處理它們的時間戳。

儘管很多技術上可以在不讀取實際數據的情況下快速讀取幀的時間戳,但DirectShow解複用器/解析器沒有定義獲取信息的方法,因此您必須讀取並計數幀獲取準確的信息。

您不需要爲此解壓縮視頻,而且您還可以在執行此操作時從濾波器圖中移除時鐘,以便計數幀不需要實時流式傳輸數據(幀將以最大速率流式傳輸在這種情況下)。

+0

我完全同意這個解決方案,但我想知道是否有一種方法來提取可用的元信息。例如,當您右鍵單擊該文件並選擇屬性和詳細信息時,它會告訴您幀速率。我懷疑它使用了這種搜索技術,因爲即使打開一個大小爲幾GB的文件也不會花時間。即使有些不準確,我希望在細節部分顯示該值。因此,我在DirectShow中尋找媒體基金會的一個替代媒介'IMFMediaType - >> GetUINT32(MF_MT_AVG_BITRATE)' – mbaros

+1

另一種替代方法是您在問題中提到的來自媒體typem的'AvgTimePerFrame'值。這是一個直接的等價物。但請注意,DirectShow和Media Foundation解析器可以不同方式提取元數據,在某些情況下,提取的值可能會有所不同。 –

+0

這正是我發生的事情。對於某些媒體文件媒體基礎和右鍵單擊屬性 - >詳細顯示8 FPS,同時計算它'AvgTimePerFrame'結束24 FPS。 – mbaros