2012-04-17 59 views
16

De acuerdo. 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?Cómo obtener la duración del video de mp4, wmv, flv, mov videos

Así que lo que necesito es gusta este video es como: 13 minutes 12 seconds

que puede utilizar 3 exes de 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.

Respuesta

11

Puede utilizar la API de DirectShow objeto MediaDet, a través de DirectShow.NET envoltorio biblioteca. Consulte Getting length of video para la muestra del código, get_StreamLength le da la duración en segundos. Esto supone que Windows tiene demultiplexor MPEG-4 instalado (requiere componentes de terceros con Windows anterior a 7, creo que lo mismo se aplica a otro answer by cezor, sin embargo, hay componentes de redistribución gratuitos).

+0

¿Dónde está esta API de DirectShot? ¿Puedes darme también la url de esta tercera parte? ¿O quieres decir k lite mega paquete de códec? – MonsterMMORPG

+0

bien probado un archivo y muestra la duración NAN: D – MonsterMMORPG

+0

Gracias esta línea da la duración correcta en segundos: mediaDet.get_StreamLength (out mediaLength); – MonsterMMORPG

5

En mi humilde opinión podría utilizar MediaInfo que le da mucha información sobre los archivos multimedia.
Tiene una CLI para que pueda usarla desde su código y obtener la información que necesita.
Puede echar un vistazo al this link.

+0

Hola. No puedo agregar mediainfodll como referencia. Sabes por qué ? Aquí mensaje de error: http://img707.imageshack.us/img707/8130/hataow.png – MonsterMMORPG

+0

@MonsterMMORPG: debe llamar a la aplicación con params y obtener resultados, no puede usarlo como referencia dentro de su solución – Marco

2

creo que busca FFMPEG - http://www.ffmpeg-csharp.com/

también hay algunas alternativas libres que se pueden leer sobre ellos en esta pregunta - Using FFmpeg in .net?

FFMpeg.NET 
    FFMpeg-Sharp 
    FFLib.NET 

se 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])); 
       } 
      } 
     } 
+0

Este es un pagar para tener la aplicación. Proporcionan solo prueba. Esto no funcionaría para mí :( – MonsterMMORPG

+0

@MonsterMMORPG mira mi edición ... –

+0

gracias, pero como he dicho, proporcionan solo prueba. – MonsterMMORPG

9

También puede utilizar Windows Media Player, a pesar de que no son compatibles con los tipos de archivo que ha solicitado alle

using WMPLib; 

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

Gracias, pero la aplicación funcionará en Windows Server 2008. Supongo que no tienen Windows Media Player – MonsterMMORPG

+0

@MonsterMMORPG Parece que tienes razón http://stackoverflow.com/a/13929540/188926 – Dunc

2

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.

Eche un vistazo a this answer para ver un ejemplo.

7

This answer sobre P/Invoke para Shell32 me recordó al Windows API Code Pack 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, averiguar la API de Shell32 para obtener varias propiedades de archivos de medios, como la duración.

Asumo la misma condición se aplica por tener instalados los demultiplexores adecuados, pero era bastante simple, ya que sólo requiere la adición de referencias a Microsoft.WindowsAPICodePack.dll y Microsoft.WindowsAPICodePack.Shell.dll y el siguiente código:

using Microsoft.WindowsAPICodePack.Shell; 
using Microsoft.WindowsAPICodePack.Shell.PropertySystem; 

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); 
    } 
} 

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); 
} 

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

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 
+0

Bastante limpio, pero la resolución de la duración es de segundos; también necesito las fracciones. Nota para todos los que intenten esto, necesitarán agregar referencias NuGet a Windows7APICodePack-Core/Shell. –

+0

¡Muchas gracias por esta respuesta! –

+0

me encanta :) Estoy totalmente de CodePack en este punto. Tenga en cuenta que el valor en bruto para la propiedad parece ser específicamente de 10^-7 segundos ... No sé si realmente se proporcionan tantos detalles para todos los tipos de archivos, pero puede buscarlos. El valor bruto está en la propiedad ".ValueAsObject" y es un ulular que necesita expulsar de un Object genérico. Editaré la respuesta para tratar de agregar esto. –

1

encontré el NReco.VideoInfo library a ser la mejor opción y mucho más simple que algunos de los de arriba. Es un simple como darle la biblioteca de una ruta de archivo y escupe los metadatos:

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

El uso de componentes Reproductor de Windows Media también, podemos conseguir la duración del vídeo.
siguiente fragmento de código puede ayudar a chicos:

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

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

0
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); 
Cuestiones relacionadas