正在获取视频长度

本文关键字:视频 获取 | 更新日期: 2023-09-27 17:58:26

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

有没有任何简单的方法可以做到这一点,无论是在C#、python、java中,都只返回一个指示视频文件长度的字符串。

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

假定标准文件格式,如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;

我找到的最简单、最完美的解决方案是使用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);
}

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

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

我尝试用不同的方式获取视频长度:
实际上,使用Windows Media Player组件,我们也可以获得视频的持续时间
以下代码片段可能会对你们有所帮助:

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

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

通过使用-i标志,您可以获得关于许多类型视频格式的各种信息,包括它们在ffmpeg中的持续时间:

ffmpeg -i videofile.whatever

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

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

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

我最近找到了一个类似问题的解决方案,与ColdFusion和FFMpeg的小表弟FFProbe。。。

有没有一种方法可以使用ColdFusion获得视频文件的持续时间?

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

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

如果使用VideoCapture对象,则可以使用Emgu.CV获取大量视频数据:

using Emgu.CV;
using (var video = new VideoCapture(path)) 
{
   double fc = (int)Math.Floor(video.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount));
   // frame count
   double fps = video.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps);
   // fps
   double length = fc / fps;
   // length in seconds
}

在这里回复是因为我无意中发现这篇帖子在寻找同样的东西——添加它以防对任何人都有帮助

Namaskaram,

最简单的方法之一是使用OpenCvSharp。它也可以用于商业用途。

using OpenCvSharp;
                
void GetVideoDuration()
{
   VideoCapture vidCapture = new VideoCapture(videoClipPath);
        
   var totalFrameCount = vidCapture.Get(VideoCaptureProperties.FrameCount);
        
   var framesPerSecond = vidCapture.Get(VideoCaptureProperties.Fps);
         
   var videoDurationInSeconds = totalFrameCount/framesPerSecond ;
}