2012-07-05 71 views
0

我需要獲取mp4文件的持續時間,最好是以秒爲單位的秒數。我正在使用DirectShow(見下面的代碼),但它一直在拋出一個特別無用的錯誤。我想知道如果有人有一個簡單的解決方案。 (說真的,誰知道得到的信息會如此困難)使用DirectShow獲取MP4文件持續時間

public static void getDuration(string moviePath) 
    { 
     FilgraphManager m_objFilterGraph = null; 
     m_objFilterGraph = new FilgraphManager(); 
     m_objFilterGraph.RenderFile(moviePath); 

     IMediaPosition m_objMediaPosition = null; 
     m_objMediaPosition = m_objFilterGraph as IMediaPosition; 

     Console.WriteLine(m_objMediaPosition.Duration); 
    } 

每當我運行此代碼,我得到的錯誤:「從HRESULT異常:0x80040265」

我用這個也試過:Getting length of video 但它不工作,因爲我不認爲它可以在MP4文件上工作。

說真的,我覺得必須有一個更簡單的方法來做到這一點。

注:我寧願避免使用exe的像ffmpeg,然後解析輸出以獲取信息。

+0

經過一番探索,看起來我實際上無法使用DirectShow獲取該信息,因爲它不支持MP4,這是令人難以置信的。無論如何,任何幫助將不勝感激。 – RedHack 2012-07-05 14:14:46

回答

2

您正在接近問題。您需要建立一個從源.MP4文件開始到視頻和音頻渲染器的良好流水線。然後IMediaPosition.Duration會得到你想要的。目前你得到VFW_E_UNSUPPORTED_STREAM,因爲你不能建立管道。

請注意,在乾淨的Windows中DirectShow中沒有對MPEG-4的良好支持,您需要安裝第三方分析器來添加缺少的塊。這是你的問題的可能原因。有很好的Free DirectShow Mpeg-4 Filters可用來填補這個空白。

鏈接Getting length of video下的代碼示例基本上也是有效的,但是它使用了不推薦使用的組件,此組件在附加條件下對所涉及的媒體文件進行了其他假設。假設在系統中支持.MP4IMediaPosition.Duration就是爲了給你看看。

+0

謝謝!但是,您能否將我鏈接到任何示例代碼,以瞭解如何使用DirectShow處理GDCL Mpeg-4過濾器,我無法在網站上找到關於如何執行此操作的任何信息。 – RedHack 2012-07-05 14:26:29

+0

你基本上需要下載這些DLL和'regvsr32'它們。那麼你的代碼片段應該是它當前的形狀。另一個可能的原因是MP4文件包含無法解碼的流,例如,目前安裝了罕見/非標準或沒有匹配的解碼器,如H.264。在原始文章中,您將無法使用這種簡單的方法獲得持續時間,您需要以稍微「微調」的方式進行操作。 – 2012-07-05 14:27:38

0

您可以使用IMediaPosition接口中的get_Duration()。

這會以秒爲單位返回一個double值和視頻持續時間。

Double Lenght; 

    m_FilterGraph = new FilterGraph() 

//Configure the FilterGraph() 

    m_mediaPosition = m_FilterGraph as IMediaPosition; 
    m_mediaPosition.get_Duration(out Length); 
相關問題