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