¿Cómo recuperar la duración de MP3 en .NET?

He creado una aplicación WPF donde los usuarios pueden arrastrar y soltar archivos MP3 en un cuadro de lista. Necesito una forma de calcular la duración total de la lista de reproducción.

¿Alguna biblioteca que deba usar? ¿O es posible usar solo el framework .NET?

Después de muchas teorizaciones, encontré una manera de calcular correcta e indiscutiblemente la duración de un archivo mp3.

Permítanme primero volver a iterar por qué los métodos estándar anteriores no funcionarán:

Método ID3: no todos los archivos tienen tags ID3, y si lo tienen, es posible que no tengan el campo de duración establecido en él.

Estimación leyendo un tamaño de archivo * frame: no va a funcionar para archivos VBR.

Cabecera Xing: no todos los archivos lo tienen.

Deencoding y determinación a través del tamaño de PCM: Tengo un archivo de 3 GB, no voy a esperar hasta que se descodifique.

Leo en todas partes y todo conduce a NAudio. Mark, GRACIAS por el buen esfuerzo y la fuente limpia! Sin embargo, un método que se sugiere principalmente con NAudio es leer un archivo usando Mp3FileReader y obtener todos los marcos. Problema: Mp3FileReader crea una TOC al inicio y eso lleva mucho tiempo, incluso para archivos pequeños de UN SOLO día 🙂

Mark sugirió que eliminara la creación de TOC, ya que la fuente está disponible y, mientras lo hacía, encontré un método mucho más simple. Aquí está; habla por sí mismo:

double GetMediaDuration(string MediaFilename) { double duration = 0.0; using (FileStream fs = File.OpenRead(MediaFilename)) { Mp3Frame frame = Mp3Frame.LoadFromStream(fs); if (frame != null) { _sampleFrequency = (uint)frame.SampleRate; } while (frame != null) { if (frame.ChannelMode == ChannelMode.Mono) { duration += (double)frame.SampleCount * 2.0 / (double)frame.SampleRate; } else { duration += (double)frame.SampleCount * 4.0 / (double)frame.SampleRate; } frame = Mp3Frame.LoadFromStream(fs); } } return duration; } 

Envolví la biblioteca de decodificadores de mp3 y la puse a disposición de los desarrolladores de .net. Lo puedes encontrar aquí:

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

Se incluyen las muestras para convertir archivos mp3 a PCM y leer tags ID3.

Supongo que se puede usar para calcular correctamente la duración del archivo mp3.

Terminé escribiendo el mío para este propósito hace unos años. Puede escribir un lado del cliente efectivo usando flash. Los puntos clave que recuerdo son:

  1. que no puede confiar en que el encabezado MP3 sea preciso, así que no solo lea eso para obtener la duración
  2. en flash, busque el final del MP3 y luego lea la posición actual. Eso te dará la duración.

Editar: me doy cuenta de que quería hacer esto con .Net, pero puede ser más útil conocer el lado del cliente antes de subir el archivo al servidor, como si quisiera imponer límites a la longitud del archivo, puede hacerlo mucho antes. en el proceso.

[mi propia solución]

He agregado un segundo control de elemento multimedia que utilizo para abrir cada archivo mp3 en el cuadro de lista y obtener su NaturalDuration. Abra y cierre cada archivo en la lista y haga una sum de todos los valores.

Según lo manifestado por otros, los encabezados mp3 no son precisos. El elemento medial proporciona la duración correcta.

Probablemente no sea el método más rápido, pero en mi caso el más simple (no depende de otras bibliotecas).