2012-03-01 38 views
0

我試圖用DirectShow獲取媒體文件的持續時間。我使用以下代碼(C#):DirectShow GetDuration給出錯誤的持續時間值

var seekingParser = filter as IMediaSeeking; 
if (seekingParser != null) 
{ 
    long duration; 
    if (seekingParser.SetTimeFormat(TimeFormat.MediaTime) == 0 
     && seekingParser.GetDuration(out duration) == 0) 
     track.Duration = duration/10000000f; 
} 

以秒爲單位獲取媒體文件持續時間。但是,當我嘗試打開3-4分鐘的MP3文件時,track.Duration變爲11-12分鐘。我試過多個文件,效果總是一樣的。可能是什麼原因?

+0

使用vbr和沒有正確的xing標題的mp3文件可能計算錯誤。更多信息:http://stackoverflow.com/questions/383164/how-to-retrieve-duration-of-mp3-in-net/13269914#13269914 – 2012-11-09 16:53:40

回答

2

您通常從應用程序端使用IMediaPosition接口(而不是IMediaSeeking)。持續時間總是以秒爲單位報告。然而,這不太可能有所作爲,而使用Windows Media API(ID3 Tag Support)可能會改變ID3標籤的閱讀時長。

是否有更可靠的方法來獲得確切的媒體文件與DirectShow API的持續時間?

的Windows Media Player通過媒體基金會,非DirectShow的API播放MP3文件,所以你不要有一個選項,在這裏想到還是做正是從DirectShow的相同。

+0

你扭轉了IMediaPosition和IMediaSeeking。 http://msdn.microsoft.com/en-us/library/dd406977(VS.85).aspx上的文檔指出「應用程序應該使用IMediaSeeking而不是IMediaPosition」。 – 2012-06-14 17:31:58

+0

那麼我會說這不是一個好建議。在圖形方面,這兩個接口都是可用的,'IMediaPosition'確實更容易使用,並不是說它是從'IDispatch'派生出來的。所以答案如上所述。 – 2012-06-14 18:04:59

2

the documentation

根據源格式,持續時間可能不準確。例如,如果源包含可變比特率(VBR)流,則該方法可能會返回估計的持續時間。

您是否正在使用VBR流?

+0

嗨,不,它是固定比特率的MP3文件;所以,據我所知,文檔從不承諾持續時間將是正確的,但Windows Media Player如何知道持續時間?使用DirectShow API獲取媒體文件的確切時長有更可靠的方法嗎? – Vitaliy 2012-03-01 13:18:17

+0

@VASoftOnline:嗯......在這種情況下不知道。如果它是固定費率的話,我真的會認爲它會好的... – 2012-03-01 13:23:24

0

您可以在乾淨的Windows安裝上嘗試相同的操作。你可能會安裝一個編解碼器(包),這是一個錯誤。