0

我需要获取 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 but it doesn't work or because I don't think that it works on MP4 files.

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

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

4

3 回答 3

2

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

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

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

于 2012-07-05T14:17:13.937 回答
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);
于 2013-01-24T12:24:57.773 回答
0

也使用 Windows Media Player 组件,我们可以获得视频的持续时间。
我希望以下代码片段可以帮助你们:

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

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

于 2019-11-06T06:31:36.770 回答