Te recomendamos que pruebes esta respuesta en un ambiente controlado antes de pasarlo a producción, saludos.
Solución:
También puede usar Windows Media Player, aunque no es compatible con todos los tipos de archivos que solicitó.
using WMPLib;
public Double Duration(String file)
WindowsMediaPlayer wmp = new WindowsMediaPlayerClass();
IWMPMedia mediainfo = wmp.newMedia(file);
return mediainfo.duration;
}
Puedes usar la API de DirectShow MediaDet
objeto, a través de la biblioteca contenedora de DirectShow.NET. Consulte Obtención de la duración del video para el ejemplo de código, get_StreamLength
te da la duración en segundos. Esto supone que Windows tiene instalado el demultiplexor MPEG-4 (requiere componentes de terceros con Windows anterior a 7, creo que lo mismo se aplica a otra respuesta de cezor, aunque hay componentes libres para redistribuir).
Esta respuesta sobre P/Invoke para Shell32 me recordó el paquete de códigos 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 de medios, como la duración.
Supongo que se aplica el mismo requisito previo para tener instalados los demultiplexores adecuados, pero fue bastante simple, ya que solo requirió agregar 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 (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);