获得视频的长度

MZi*_*an6 14 c# video duration ffmpeg

我无法找到一个如何以编程方式获取文件视频长度的简单示例.很多人说,哦,使用这个库/包装或其他什么,但不说如何.我已经下载了ffmpeg,但不知道如何实际使用它,似乎没有任何关于如何使用它来获取视频持续时间的示例.我看到你如何使用它来转换视频,但我只是想知道视频的持续时间.所有其他信息都无关紧要.

有没有办法简单地做到这一点,无论是在C#,python,java等等,它只会返回一个表示视频文件长度的字符串.

如果可能,请提供示例.提前致谢!

假设标准文件格式,例如wmv,avi,mp4,mpeg.有元数据的东西.

nZe*_*eus 14

这是一个例子:

using DirectShowLib;
using DirectShowLib.DES;
using System.Runtime.InteropServices;

...

var mediaDet = (IMediaDet)new MediaDet();
DsError.ThrowExceptionForHR(mediaDet.put_Filename(FileName));

// find the video stream in the file
int index;
var type = Guid.Empty;
for (index = 0; index < 1000 && type != MediaType.Video; index++)
{
    mediaDet.put_CurrentStream(index);
    mediaDet.get_StreamType(out type);
}

// retrieve some measurements from the video
double frameRate;
mediaDet.get_FrameRate(out frameRate);

var mediaType = new AMMediaType();
mediaDet.get_StreamMediaType(mediaType);
var videoInfo = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.formatPtr, typeof(VideoInfoHeader));
DsUtils.FreeAMMediaType(mediaType);
var width = videoInfo.BmiHeader.Width;
var height = videoInfo.BmiHeader.Height;

double mediaLength;
mediaDet.get_StreamLength(out mediaLength);
var frameCount = (int)(frameRate * mediaLength);
var duration = frameCount / frameRate;
Run Code Online (Sandbox Code Playgroud)

  • 如果我的计算机上有.mp4文件,则put_Filename会引发COMException。它说:“ DirectShowLib.dll中发生了'System.Runtime.InteropServices.COMException类型的未处理的异常。附加信息:指定了无效的媒体类型。” (3认同)

You*_*jae 7

我发现的简单而完美的解决方案是使用MediaToolkit nuget 包。

using MediaToolkit;

// a method to get Width, Height, and Duration in Ticks for video.
public static Tuple<int, int, long> GetVideoInfo(string fileName)
{
    var inputFile = new MediaToolkit.Model.MediaFile { Filename = fileName };
    using (var engine = new Engine())
    {
        engine.GetMetadata(inputFile);
    }

    // FrameSize is returned as '1280x768' string.
    var size = inputFile.Metadata.VideoData.FrameSize.Split(new[] { 'x' }).Select(o => int.Parse(o)).ToArray();

    return new Tuple<int, int, long>(size[0], size[1], inputFile.Metadata.Duration.Ticks);
}
Run Code Online (Sandbox Code Playgroud)


rup*_*llo 5

开源工具MediaInfo为媒体文件提供了全面的元数据,可以从您自己的应用程序中以DLL形式轻松使用它:

void* Hande=MediaInfo::OpenQuick("**FILENAME**", "**VERSION**;**APP_NAME**;**APP_VERSION**")
MediaInfo::Inform()
Run Code Online (Sandbox Code Playgroud)