【问题标题】:Getting MP4 File Duration with DirectShow使用 DirectShow 获取 MP4 文件的持续时间
【发布时间】:2012-07-05 23:08:21
【问题描述】:

我需要获取 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,然后解析输出以获取信息。

【问题讨论】:

  • 经过一番探索,我似乎无法通过 DirectShow 获得该信息,因为它不支持 MP4,这令人难以置信。无论如何,我们将不胜感激。

标签: c# directshow mp4 duration directshow.net


【解决方案1】:

您正确地解决了问题。您需要从源 .MP4 文件开始构建一个良好的管道,直到视频和音频渲染器。然后IMediaPosition.Duration 会给你你想要的。目前您收到VFW_E_UNSUPPORTED_STREAM,因为您无法构建管道。

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

链接Getting length of video 下的代码示例也基本有效,但是它使用了已弃用的组件,该组件还对相关媒体文件做出了额外的假设。前提是系统支持.MP4IMediaPosition.Duration就是给你你想要的。

【讨论】:

  • 谢谢!但是你能把我链接到任何关于如何让 GDCL Mpeg-4 过滤器与 DirectShow 一起工作的示例代码吗?我在网站上找不到任何关于如何做到这一点的信息。
  • 你基本上需要下载那些 DLL 和regvsr32 他们。那么你的代码 sn-p 应该是它当前的形状。另一个可能的原因是 MP4 文件包含无法解码的流,例如当前安装了诸如 H.264 之类的稀有/非标准或没有匹配的解码器。您将无法在原始帖子中使用这种简单的方法获得持续时间,您需要以稍微“微调”的方式进行。
【解决方案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);

【讨论】:

    【解决方案3】:

    也使用 Windows Media Player 组件,我们可以获得视频的时长。
    我希望以下代码 sn-p 可以帮助你们:

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

    并且不要忘记添加 wmp.dll 的引用,这将是 存在于 System32 文件夹中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 2018-01-23
      相关资源
      最近更新 更多