我无法找到一个如何以编程方式获取文件视频长度的简单示例。很多人说,哦使用这个库/包装或其他什么,但不说如何。我已经下载了ffmpeg,但不知道如何实际使用它,似乎没有任何关于如何使用它来获取视频持续时间的示例。我看到你如何使用它来转换视频,但我只是想知道视频的持续时间。所有其他信息都无关紧要。
有没有办法简单地这样做,无论是在C#,python,java等等,只会返回一个表示视频文件长度的字符串。
如果可能,请提供示例。提前谢谢!
假设标准文件格式,例如wmv,avi,mp4,mpeg。有元数据的东西。
答案 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)
检查此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
}
之所以做出回应,是因为我偶然发现了这篇博文,寻找相同的内容-添加它是为了防止对任何人有帮助。