Obteniendo la duración del video

Tengo problemas para encontrar un ejemplo simple de cómo obtener la duración del video de un archivo mediante progtwigción. Mucha gente dice, oh, usa esta biblioteca / envoltorio o lo que sea, pero no digas cómo. He descargado ffmpeg, pero no tengo ni idea de cómo usarlo realmente y no parece haber ningún ejemplo de cómo usarlo para obtener la duración del video. Veo cómo puedes usarlo para convertir videos, pero simplemente quiero saber la duración de un video. Toda la otra información no importa.

¿Hay alguna forma de hacer esto simplemente, ya sea en C #, python, java, lo que sea, que simplemente devolverá una cadena que indica la longitud de un archivo de video.

Proporcione ejemplos si es posible. ¡Gracias por adelantado!

Asum los formatos de archivo estándar, como wmv, avi, mp4, mpeg. Cosas que tienen metadatos.

Aquí hay un ejemplo:

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; 

La herramienta de código abierto MediaInfo proporciona metadatos integrales para archivos multimedia y se puede usar fácilmente desde su propia aplicación en formato DLL:

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

puede obtener todo tipo de información sobre muchos tipos de formatos de video, incluida su duración con ffmpeg utilizando la opción -i:

 ffmpeg -i videofile.whatever 

Si quieres una buena biblioteca que pueda envolver ffmpef para ti en C #, entonces puedes usar MediaHandlerPro

He tratado de obtener la duración del video de una manera un poco diferente:
En realidad, al usar Windows Media Player Component también, podemos obtener la duración del video.
El siguiente fragmento de código puede ayudarlos:

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

y no olvide agregar la referencia de wmp.dll que estará presente en la carpeta System32 .

Recientemente encontré una solución a un problema similar que tenía, con ColdFusion y el primo de FFMpeg, FFProbe …

¿Hay alguna manera de obtener la duración de un archivo de video usando ColdFusion?

FFProbe tiene un argumento show_streams que empuja una cantidad considerable de información en la secuencia inicial dentro de la salida devuelta; incluyendo el ancho, alto y duración de un video …

No estoy seguro de la syntax de C # para ejecutar el equivalente de “ffprobe.exe -show_streams testFile”, pero estoy seguro de que una vez que se haya dado cuenta, puede analizar la información que necesita del resultado que recibe.

ffprobe es una herramienta complementaria del proyecto ffmpeg. Además de proporcionar información de una amplia gama de formatos de archivo, también puede publicar en formato JSON para facilitar el análisis.

Verifique esta respuesta para ver un ejemplo de salida JSON.

La solución fácil e impecable que encontré es usar el paquete Nuto de MediaToolkit.

 using MediaToolkit; // a method to get Width, Height, and Duration in Ticks for video. public static Tuple 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(size[0], size[1], inputFile.Metadata.Duration.Ticks); }