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

时间:2012-07-05 14:12:51

标签: c# directshow mp4 duration directshow.net

我需要获取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”

我也试过这个:Getting length of video 但它不起作用,因为我认为它不适用于MP4文件。

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

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

3 个答案:

答案 0 :(得分:2)

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

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

链接Getting length of video下的代码示例基本上也是有效的,但是它使用了不推荐使用的组件,这会对相关媒体文件做出额外的假设。如果系统中有.MP4支持,IMediaPosition.Duration将为您提供所需内容。

答案 1 :(得分:0)

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

这将返回一个双倍值,视频持续时间以秒为单位。

    Double Lenght;

    m_FilterGraph = new FilterGraph()

//Configure the FilterGraph()

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

答案 2 :(得分:0)

还使用Windows Media Player组件,可以获取视频的时长。
我希望以下代码段可以对您有所帮助:

using WMPLib;
// ...
var player = new WindowsMediaPlayer();
var clip = player.newMedia(filePath);
Console.WriteLine(TimeSpan.FromSeconds(clip.duration));
  

并且不要忘记添加 wmp.dll 的引用   出现在 System32 文件夹中。