获得video的长度

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

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

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

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

这是一个例子:

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; 

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

 void* Hande=MediaInfo::OpenQuick("**FILENAME**", "**VERSION**;**APP_NAME**;**APP_VERSION**") MediaInfo::Inform() 

您可以使用-i标志获取有关许多类型video格式的各种信息,包括使用ffmpeg的持续时间:

 ffmpeg -i videofile.whatever 

如果你想要一个可以在C#中为你包装ffmpef的漂亮库,那么你可以使用MediaHandlerPro

我试图以不同的方式获取video长度:
实际上也使用Windows Media Player组件,我们可以获得video的持续时间。
以下代码段可能会帮助您:

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

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

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

 using MediaToolkit; // a method to get Width, Height, and Duration in Ticks for video. public static Tuple 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(size[0], size[1], inputFile.Metadata.Duration.Ticks); } 

我最近找到了解决类似问题的解决方案,使用ColdFusion和FFMpeg的小表兄,FFProbe ……

有没有办法使用ColdFusion获取video文件的持续时间?

FFProbe有一个show_streams参数,它在返回的输出中推出初始流中的大量信息; 包括video的宽度,高度和持续时间……

不确定C#运行相当于“ffprobe.exe -show_streams testFile”的语法,但我相信一旦你弄清楚了,你可以从你收到的输出中解析出你需要的信息。

ffprobe是ffmpeg项目的公司工具。 除了从各种文件格式中提供信息之外,它还可以输出JSON格式以简化解析。

请查看此答案以获取JSON输出的示例。