2011-06-02 211 views
10

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

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

请尽可能提供示例。提前致谢!

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

+1

答案取决于文件格式。没有任何工具可以返回有关您交付的任何任意视频文件的信息。 – 2011-06-02 13:32:38

回答

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

这对我很好,而且使用起来非常简单。但我确实发现了一些小问题。似乎并不是所有的.avi文件都适用于此。也许它与视频文件的大小(> 1 GB)有关,但无论如何。它对我很好。谢谢你的帮助! – MZimmerman6 2011-06-04 13:28:55

+0

put_Filename在我机器上的.mp4文件的情况下抛出COMException。它说:“DirectShowLib.dll 中发生类型'System.Runtime.InteropServices.COMException'的未处理的异常发生附加信息:指定了一个无效的媒体类型。” – EngineerSpock 2017-06-03 19:01:38

2

您可以通过使用-i标志获取各种关于多种类型的视频格式,包括他们与ffmpeg的时间信息:

ffmpeg -i videofile.whatever 

如果你想有一个好的库,可以在C#包装ffmpef你那么你可以使用MediaHandlerPro

4

开源工具MediaInfo提供全面的我TA-数据,媒体文件,并且可以在DLL形式使用easily从自己的应用程序:

void* Hande=MediaInfo::OpenQuick("**FILENAME**", "**VERSION**;**APP_NAME**;**APP_VERSION**") 
MediaInfo::Inform() 
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”的等效语句,但是我确信一旦你明白了,你可以从您收到的输出中解析出您需要的信息。

0

ffprobe是ffmpeg项目的公司工具。除了从广泛的文件格式中获取信息外,它还可以以JSON格式输出以简化解析。

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

1

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

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

,不要忘记添加的wmp.dll的参考,这将是 出现在System32文件夹。

0

我发现的简单而完美的解决方案是使用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); 
}