使用DirectShow获取MP4文件持续时间

我需要获取mp4文件的持续时间,最好是以秒为单位的两倍。 我正在使用DirectShow(参见下面的代码),但它一直在抛出一个特别无益的错误。 我想知道是否有人有一个简单的解决方案。 (说真的,谁知道获取这些信息会非常困难)

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的exception:0x80040265”

我也试过使用这个: 得到video的长度,但它不起作用,因为我不认为它适用于MP4文件。

说真的,我觉得必须有一个更简单的方法来做到这一点。

注意:我宁愿避免使用类似ffmpeg的exe,然后解析输出以获取信息。

您正在接近问题。 您需要构建一个良好的管道,从源.MP4文件开始,再到video和音频渲染器。 然后IMediaPosition.Duration将为您提供您想要的。 目前您正在获得VFW_E_UNSUPPORTED_STREAM因为您无法构建管道。

请注意,在干净的Windows中,DirectShow中没有对MPEG-4的良好支持,您需要安装第三方解析器来添加丢失的块。 这可能是您遇到问题的原因。 有很好的Free DirectShow Mpeg-4filter可以填补这个空白。

“ 获取video长度 ”链接下的代码示例基本上也是有效的,但是它使用了不推荐使用的组件,该组件还会对相关媒体文件进行额外的假设。 如果系统中支持.MP4 ,则IMediaPosition.Duration您提供所需内容。

您可以使用IMediaPosition界面中的get_Duration()。

这将返回一个double值,video持续时间以秒为单位。

  Double Lenght; m_FilterGraph = new FilterGraph() //Configure the FilterGraph() m_mediaPosition = m_FilterGraph as IMediaPosition; m_mediaPosition.get_Duration(out Length);