掌握DirectShow的MP4文件播放时间(Getting MP4 File Duration w

2019-06-26 02:22发布

我需要一个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异常:0x80040265”

我用这个也尝试: 视频的获取长度 ,但它不工作,或者是因为我不认为它的工作原理上的MP4文件。

说真的,我觉得必须有这样做更简单的方法。

注意:我宁愿避免使用exe文件的ffmpeg的一样,然后解析输出来获取信息。

Answer 1:

你是正确的逼近问题。 你需要建立一个良好的管道从源头做起.MP4文件和最多的视频和音频渲染器。 然后IMediaPosition.Duration会得到你想要的东西。 目前你正在VFW_E_UNSUPPORTED_STREAM因为你不能建立管道。

请注意,在干净的Windows为MPEG-4没有很好的支持DirectShow中,你需要安装添加缺失块第三方解析器。 这是你的问题的可能原因。 有良好的免费DirectShow的MPEG-4过滤器可用来填补这一空白。

链接下的代码示例获取视频的长度基本上是有效的也是如此,但是它使用过时的组件,它在另外进行其他假设到有问题的媒体文件。 只要有支持.MP4系统, IMediaPosition.Duration是给你,你找什么。



Answer 2:

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

这回在秒的视频长度的双精度值。

    Double Lenght;

    m_FilterGraph = new FilterGraph()

//Configure the FilterGraph()

    m_mediaPosition = m_FilterGraph as IMediaPosition;
    m_mediaPosition.get_Duration(out Length);


文章来源: Getting MP4 File Duration with DirectShow