使用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);