Pregunta

Actualmente estoy en el proceso de mover mi aplicación C # a Qt / C ++. Estoy corriendo a tener problemas con longitudes de TagLib. Me parece extraño que las duraciones TagLib # devuelve audio en milisegundos, mientras que TagLib vuelve sus duraciones (incorrectos) en cuestión de segundos. TagLib sólo devuelve cero para los valores de longitud, mientras que TagLib # sigue siendo correcta.

Aquí está mi fuente en C # / # TagLib ...

TagLib.File tagfile = TagLib.File.Create(path);
uint milliseconds = (uint)tagfile.Properties.Duration.TotalMilliseconds;

Y aquí es lo que debería ser casi equivalente en C ++ / TagLib. Incluso he obligado a leer con precisión. Sin éxito.

TagLib::FileName fn(path);
TagLib::FileRef fr(fn, true, TagLib::AudioProperties::Accurate);
uint length = fr.audioProperties()->length();

Funciona como se esperaba para una buena mayoría de mis archivos multimedia. Sin embargo, un grupo selecto de archivos de audio no devuelven las propiedades de audio (el resto de la información de la etiqueta lee bien!). Las mismas propiedades exactas de audio se devuelven sin problemas en TagLib #.

Cualquier ideas son apreciadas. Gracias.

¿alguien tiene más ideas antes de los extremos de recompensas?

¿Fue útil?

Solución

Hola hay un parche para taglib que calcular la longitud en milisegundos, este individuo ha añadido un método (lengthMilliseconds ()) que devuelven la longitud en milisegundos, tal vez eso podría ser útil para Usted: http://web.archiveorange.com/archive/v/sF3Pjr01lSQjsqjrAC7L

Otros consejos

Muchas cosas han cambiado en TagLib # 's análisis de los archivos de audio desde que fue portado originalmente, así que es difícil decir exactamente donde se produciría la diferencia. Usted puede revisar su programa en C ++ para los mensajes de depuración.

Mi conjetura es que la diferencia está en cómo las dos bibliotecas reaccionan a los encabezados no válidos. Parece ser que si el primer encabezado de la trama que encuentra no es válido, no TagLib calcular cualquier valor de propiedad de audio. TagLib #, por el contrario, busca la primera cabecera válida en el primer 16KiB de la parte de audio del archivo. Si la primera cabecera que encuentra es corrupto, la aplicación buscará la siguiente. Si no recuerdo mal, una etiqueta ID3v2 incorrectamente ahorrado podría dar lugar a 0xFF FF FF FF aparece en el comienzo de la sección de audio del archivo. Esto desencadenar el tipo de fallo descrito anteriormente.

El problema es en la línea 166 de taglib / mpeg / mpegproperties.cpp. Esto podría ser resuelto utilizando el mismo enfoque que las líneas 171 a 191, pero usted quiere actualizar el código que renunciar después de un punto en caso de que realmente no es un archivo MP3.

Al escribir estas líneas, TagLib 1.11 Beta 2 soportes de forma nativa para conseguir la longitud de audio en milisegundos. Puede hacerlo con el siguiente código:

TagLib::FileRef f(path);
int lengthInMillis = f.audioProperties()->lengthInMilliseconds();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top