2012-07-05 58 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); 
相关问题