2009-07-31 24 views
8

Sí, este es un duplicado exacto de this question, pero el enlace dado y aceptado como respuesta no funciona para mí. Está devolviendo valores incorrectos (un mp3 de 2 minutos aparecerá como 1'30, 3 minutos como 2'20) sin un patrón obvio.Cómo obtener la longitud de un MP3 en C#

Así que aquí está de nuevo: ¿cómo puedo obtener la longitud de un MP3 usando C#?

o

¿Qué estoy haciendo mal con el MP3Header class:

MP3Header mp3hdr = new MP3Header(); 
bool boolIsMP3 = mp3hdr.ReadMP3Information("1.mp3"); 
if(boolIsMP3) 
    Response.Write(mp3hdr.intLength); 
+0

Tipo de pregunta duplicada; Traté de responder eso aquí: http://stackoverflow.com/questions/383164/how-to-retrieve-duration-of-mp3-in-net/13269914#13269914 –

Respuesta

10

Aparentemente, esta clase calcula la duración usando fileSize/bitRate. Esto sólo puede funcionar de tasa de bits constante, y supongo que su MP3 tiene tasa de bits variable ...

EDIT: echar un vistazo a TagLib Sharp, se le puede dar la duración

+0

Parece tasa de bits constante (ver mi comentario sobre la respuesta de Jon). ¿Cómo podría probar esto? – marcgg

+0

sobre su edición: taglib puede obtener la duración? Sería increíble, lo veré ahora mismo – marcgg

+0

Solo devuelve 0 ... Supongo que los archivos que me han dado están codificados de manera extraña, lo que explicaría todo esto. Creo que voy a encontrar una forma de evitarlo – marcgg

4

Cómo han comprobado que las longitudes de los archivos MP3 que son "malo"? A menudo he encontrado que la información del encabezado puede ser incorrecta: había una versión particular de LAME que tenía este problema, por ejemplo.

Si sube las propiedades del archivo en el Explorador de Windows, ¿qué muestra eso?

+0

Un ejemplo: Audio MPEG Layer 3, Duración 1: 29, Velocidad de bits: 128 kbps, Velocidad de audio: 44 kHz. La función encuentra algo así como 1:12 para la duración. No tendré control sobre el tipo de MP3 que se cargará en el sistema, por lo que necesito que funcione sin importar la codificación/tasa de bits/lo que sea. – marcgg

+0

Después de probar con taglib, creo que los mp3s que me han dado están un poco desordenados o codificados de forma diferente ... Voy a trabajar en esto (ver mis otros comentarios sobre las respuestas de Jon y Thomas) – marcgg

+4

@marcgg: Personalmente creo que debes aceptar la respuesta de Thomas, ya que es más útil en general. –

0

Considero usar una aplicación externa para hacer esto. Considere probar Sox y simplemente ejecute la versión del programa que se ejecuta mediante soxi (no exe) y trate de analizar esa salida. Dadas tus opciones, creo que es mejor que simplemente confíes en alguien más que se haya tomado el tiempo para resolver todas las rarezas de los archivos mp3 a menos que esta funcionalidad sea esencial para lo que estás haciendo. ¡Buena suerte!

+0

sox suena demasiado para lo que estoy tratando de hacer, ¿no crees? – marcgg

+0

Sí, pero si funciona todo el tiempo y puede seguir con la vida, ¿no vale la pena? – Jon

+0

cierto :) Creo que voy a encontrar una forma de evitarlo. Todo esto es para enviar a un reproductor de flash, pero sé cómo obtener la duración en el flash, así que puedo resolverlo una vez que se envía el archivo. Gracias por el pensamiento! – marcgg

3

Envolví la biblioteca de decodificadores de mp3 y la hice disponible para desarrolladores de .net. Lo puedes encontrar aquí:

http://sourceforge.net/projects/mpg123net/

se incluyen las muestras de convertir archivos mp3 a PCM, y leer las etiquetas ID3.

Supongo que puede usarlo para leer la duración del archivo mp3. El peor caso será que lea todos los cuadros y calcule la duración: archivo VBR.

Para determinar con precisión la duración de los mp3, usted TIENE lea todos los cuadros y calcule la duración de su duración total. Hay muchos casos en que las personas colocan varios 'metadatos' dentro de los archivos mp3, por lo que si estima la tasa de bits y el tamaño del archivo, adivinará mal.

0

La longitud del archivo VBR NO PUEDE ser estimada en absoluto. Cada cuadro de mp3 dentro de él puede tener una velocidad de bits diferente, por lo que al leer cualquier parte del archivo, no se puede saber qué densidad de datos hay en ninguna otra parte del archivo. La única forma de determinar la duración EXACTA de VBR mp3 es DEDICARLA en su totalidad, O (si sabe cómo) leer todos los encabezados de los fotogramas uno por uno, y recopilar su DURACIÓN decodificada.

Utilizará el método posterior solo si la CPU que utiliza es un recurso precioso que debe guardar. De lo contrario, decodifica todo el archivo y tendrás la duración.

Puede usar mi puerto de mpg123 para hacer el trabajo: http://sourceforge.net/projects/mpg123net/

Más: muchos archivos mp3 tienen "cosas" añadido a la misma, como las etiquetas ID3, y si no va a través de todo el archivo Podría usar esa etiqueta por error en el cálculo de la duración.

0

Existe mi solución para C# con la biblioteca de procesamiento de sonido sox.

public static double GetAudioDuration(string soxPath, string audioPath) 
{ 
    double duration = 0; 
    var startInfo = new ProcessStartInfo(soxPath, 
     string.Format("\"{0}\" -n stat", audioPath)); 
    startInfo.UseShellExecute = false; 
    startInfo.CreateNoWindow = true; 
    startInfo.RedirectStandardError = true; 
    startInfo.RedirectStandardOutput = true; 
    var process = Process.Start(startInfo); 
    process.WaitForExit(); 

    string str; 
    using (var outputThread = process.StandardError) 
     str = outputThread.ReadToEnd(); 

    if (string.IsNullOrEmpty(str)) 
     using (var outputThread = process.StandardOutput) 
      str = outputThread.ReadToEnd(); 

    try 
    { 
     string[] lines = str.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
     string lengthLine = lines.First(line => line.Contains("Length (seconds)")); 
     duration = double.Parse(lengthLine.Split(':')[1]); 
    } 
    catch (Exception ex) 
    { 
    } 

    return duration; 
} 
Cuestiones relacionadas