Cómo obtener la duración del video de videos mp4, wmv, flv, mov

Bien. En realidad, necesito principalmente el formato mp4. Pero si es posible obtener otros tipos también sería bueno. Solo necesito leer la duración del archivo. ¿Cómo puedo hacer eso con C # 4.0?

Entonces, lo que necesito es como este video es como: 13 minutes 12 seconds

Puedo usar 3 exes terceros también. Al igual que guardan la información sobre el archivo en un archivo de texto. Puedo analizar ese archivo de texto.

Gracias.

Puede usar el objeto MediaDet DirectShow API a través de la biblioteca contenedora DirectShow.NET. Consulte Cómo obtener la duración del video para la muestra del código, get_StreamLength da la duración en segundos. Esto supone que Windows tiene demultiplexor MPEG-4 instalado (requiere componentes de terceros con Windows antes de 7, creo que lo mismo se aplica a otra respuesta de cezor , sin embargo , hay componentes de redistribución gratuitos).

También puede usar Windows Media Player, aunque no es compatible con los tipos de archivos alle que solicitó

 using WMPLib; public Double Duration(String file) { WindowsMediaPlayer wmp = new WindowsMediaPlayerClass(); IWMPMedia mediainfo = wmp.newMedia(file); return mediainfo.duration; } } 

Esta respuesta sobre P / Invoke para Shell32 me recordó el paquete de código API de Windows para acceder a las API comunes de Windows Vista / 7/2008 / 2008R2.

Fue muy fácil, utilizando la demostración de PropertyEdit en las muestras incluidas, descubrir la API de Shell32 para obtener varias propiedades de archivos multimedia, como la duración.

Supongo que se aplica el mismo requisito previo para tener instalados los demultiplexores adecuados, pero era bastante simple, ya que solo requería agregar referencias a Microsoft.WindowsAPICodePack.dll y Microsoft.WindowsAPICodePack.Shell.dll y al siguiente código:

 using Microsoft.WindowsAPICodePack.Shell; using Microsoft.WindowsAPICodePack.Shell.PropertySystem; using (ShellObject shell = ShellObject.FromParsingName(filePath)) { // alternatively: shell.Properties.GetProperty("System.Media.Duration"); IShellProperty prop = shell.Properties.System.Media.Duration; // Duration will be formatted as 00:44:08 string duration = prop.FormatForDisplay(PropertyDescriptionFormatOptions.None); } 

Otras cosas

Algunas propiedades comunes para un archivo multimedia de audio MPEG-4 / AAC:

 System.Audio.Format = {00001610-0000-0010-8000-00AA00389B71} System.Media.Duration = 00:44:08 System.Audio.EncodingBitrate = ?56kbps System.Audio.SampleRate = ?32 kHz System.Audio.SampleSize = ?16 bit System.Audio.ChannelCount = 2 (stereo) System.Audio.StreamNumber = 1 System.DRM.IsProtected = No System.KindText = Music System.Kind = Music 

Es fácil iterar a través de todas las propiedades si está buscando los metadatos disponibles:

 using (ShellPropertyCollection properties = new ShellPropertyCollection(filePath)) { foreach (IShellProperty prop in properties) { string value = (prop.ValueAsObject == null) ? "" : prop.FormatForDisplay(PropertyDescriptionFormatOptions.None); Console.WriteLine("{0} = {1}", prop.CanonicalName, value); } } 

En mi humilde opinión, podría usar MediaInfo, que le da mucha información sobre los archivos multimedia.
Existe una CLI para que pueda usarla desde su código y obtener la información que necesita.
Puedes echarle un vistazo a este enlace .

Creo que estás buscando FFMPEG – http://www.ffmpeg-csharp.com/

También hay algunas alternativas gratuitas que puedes leer sobre ellas en esta pregunta: ¿ usar FFmpeg en .net?

  FFMpeg.NET FFMpeg-Sharp FFLib.NET 

Puede ver este enlace para ver ejemplos de cómo usar FFMPEG y encontrar la duración – http://jasonjano.wordpress.com/2010/02/09/a-simple-c-wrapper-for-ffmpeg/

  public VideoFile GetVideoInfo(string inputPath) { VideoFile vf = null; try { vf = new VideoFile(inputPath); } catch (Exception ex) { throw ex; } GetVideoInfo(vf); return vf; } public void GetVideoInfo(VideoFile input) { //set up the parameters for video info string Params = string.Format("-i {0}", input.Path); string output = RunProcess(Params); input.RawInfo = output; //get duration Regex re = new Regex("[D|d]uration:.((\\d|:|\\.)*)"); Match m = re.Match(input.RawInfo); if (m.Success) { string duration = m.Groups[1].Value; string[] timepieces = duration.Split(new char[] { ':', '.' }); if (timepieces.Length == 4) { input.Duration = new TimeSpan(0, Convert.ToInt16(timepieces[0]), Convert.ToInt16(timepieces[1]), Convert.ToInt16(timepieces[2]), Convert.ToInt16(timepieces[3])); } } } 

El proyecto FFMPEG tiene una herramienta, llamada ffprobe, que puede proporcionarle la información que necesita sobre sus archivos multimedia y mostrar la información en un formato JSON con formato.

Echa un vistazo a esta respuesta para ver un ejemplo.

Encontré la biblioteca NReco.VideoInfo como la mejor opción y mucho más simple que algunas de las anteriores. Es tan simple como darle a la biblioteca una ruta de archivo y escupe los metadatos:

 var ffProbe = new FFProbe(); var videoInfo = ffProbe.GetMediaInfo(blob.Uri.AbsoluteUri); return videoInfo.Duration.TotalMilliseconds; 

Usando 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 .

 StreamReader errorreader; string InterviewID = txtToolsInterviewID.Text; Process ffmpeg = new Process(); ffmpeg.StartInfo.UseShellExecute = false; ffmpeg.StartInfo.ErrorDialog = false; ffmpeg.StartInfo.RedirectStandardError = true; ffmpeg.StartInfo.FileName = Server.MapPath("ffmpeg.exe"); ffmpeg.StartInfo.Arguments = "-i " + Server.MapPath("videos") + "\\226.flv"; ffmpeg.Start(); errorreader = ffmpeg.StandardError; ffmpeg.WaitForExit(); string result = errorreader.ReadToEnd(); string duration = result.Substring(result.IndexOf("Duration: ") + ("Duration: ").Length, ("00:00:00.00").Length);