获得视频的长度

时间:2011-06-02 13:29:10

标签: c# video ffmpeg duration

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

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

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

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

7 个答案:

答案 0 :(得分:12)

以下是一个例子:

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;

答案 1 :(得分:4)

开源工具MediaInfo为媒体文件提供了全面的元数据,可以在DLL格式的应用程序中使用easily

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

答案 2 :(得分:2)

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

ffmpeg -i videofile.whatever

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

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

Is there a way to obtain the duration of a video file using ColdFusion?

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

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

答案 5 :(得分:0)

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

检查此answer以获取JSON输出的示例。

答案 6 :(得分:0)

如果使用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
}

之所以做出回应,是因为我偶然发现了这篇博文,寻找相同的内容-添加它是为了防止对任何人有帮助。