Question

Je suis actuellement en train de passer mon application C # vers Qt / C ++. Je suis en cours d'exécution dans des problèmes avec des longueurs de TagLib. Je trouve étrange que TagLib # retours durées audio en millisecondes, alors que TagLib retourne ses durées (incorrectes) en quelques secondes. TagLib juste retour zéro pour les valeurs de longueur, tandis que TagLib # reste correcte.

Voici ma source en C # / TagLib # ...

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

Et voici ce qui devrait être à peu près équivalent en C ++ / TagLib. J'ai même forcé à lire avec précision. Aucun succès.

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

Il fonctionne comme prévu pour une bonne majorité de mes fichiers multimédias. Cependant, sélectionnez quelques fichiers audio ne parviennent pas à restituer les propriétés audio (le reste des informations de l'étiquette se lit comme suit très bien!). Les propriétés audio exactement les mêmes sont retournés sans problème sur TagLib #.

Toutes les idées sont appréciés. Merci.

Est-ce que quelqu'un a des idées plus avant la fin de la prime?

Était-ce utile?

La solution

Salut il y a un patch pour taglib qui calculent la longueur en millisecondes, ce gars-là a ajouté une méthode (lengthMilliseconds ()) qui retourne la longueur en millisecondes, peut-être qui pourraient être utiles pour vous: http://web.archiveorange.com/archive/v/sF3Pjr01lSQjsqjrAC7L

Autres conseils

Beaucoup de choses ont changé dans TagLib # l'analyse syntaxique de "des fichiers audio depuis qu'il a été à l'origine porté, il est donc difficile de dire où exactement la différence se produirait. Vous pouvez vérifier votre programme C ++ pour les messages de débogage.

Je pense que la différence est dans la façon dont les deux bibliothèques réagissent aux en-têtes non valides. Il semble que si le premier en-tête de trame, il trouve est invalide, TagLib ne calcule pas les valeurs des propriétés audio. TagLib #, d'autre part, regards pour la première tête valide dans la première 16KiB de la partie audio du fichier. Si la première rencontre en-tête est corrompu, il va scanner le prochain. Si je me souviens bien, une étiquette ID3v2 mal enregistrée pourrait entraîner 0xFF FF FF FF apparaissant au début de la section audio du fichier. Cela déclencherait le type de défaillance décrit ci-dessus.

Le problème est à la ligne 166 de taglib / mpeg / mpegproperties.cpp. Cela pourrait être résolu en utilisant la même approche que les lignes 171 à 191, mais vous souhaitez mettre à jour le code pour abandonner après un point dans le cas où il est vraiment pas un fichier MP3.

A ce jour, TagLib 1.11 BETA 2 supporte nativement obtenir la longueur de l'audio en millisecondes. Vous pouvez le faire avec le code suivant:

TagLib::FileRef f(path);
int lengthInMillis = f.audioProperties()->lengthInMilliseconds();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top