I am having trouble finding a simple example of how to get the video length of a file programmatically. Many people say, oh use this library/wrapper or whatever, but do not
you can get all sorts of information about many types of video formats including their duration with ffmpeg by using the -i flag:
ffmpeg -i videofile.whatever
If you want a nice library that can wrap ffmpef for you in C# then you can use MediaHandlerPro
I recently found a solution to a similar problem I had, with ColdFusion and FFMpeg's little cousin, FFProbe...
Is there a way to obtain the duration of a video file using ColdFusion?
FFProbe has a show_streams argument that pushes out a considerable amount of information in the initial stream within the returned output; including the width, height and duration of a video...
Not sure about C#'s syntax for running the equivalent of "ffprobe.exe -show_streams testFile" but I'm sure once you've figured that out, you can parse out the information you need from the output you receive.
I have tried to get the video length in a bit different way :
Actually using Windows Media Player Component also, we can get the duration of the video.
Following code snippet may help you guys :
using WMPLib;
// ...
var player = new WindowsMediaPlayer();
var clip = player.newMedia(filePath);
Console.WriteLine(TimeSpan.FromSeconds(clip.duration));
and don't forget to add the reference of
wmp.dll
which will be present inSystem32
folder.
Here is an example:
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;
The easist and flawless solution I found is to use MediaToolkit nuget package.
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);
}
ffprobe is companian tool from the ffmpeg project. Besides provinding information from a wide range of file formats, it can also ouput in a JSON format to ease the parsing.
Check this answer for an example of a JSON output.