2010-11-29 7 views
3

Ich bin gerade dabei, meine C# -Anwendung auf Qt/C++ zu verschieben. Ich habe Probleme mit Längen von TagLib. Ich finde es seltsam, dass TagLib # die Audiodauer in Millisekunden zurückgibt, während TagLib die (inkorrekte) Dauer in Sekunden zurückgibt. TagLib gibt nur Null für die Längenwerte zurück, während TagLib # korrekt bleibt.Unterschiede in der Länge in TagLib # (C#) und TagLib (C++)

Hier ist meine Quelle in C#/TagLib # ...

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

Und hier ist das, was in C++/TagLib fast gleichwertig sein sollte. Ich habe es sogar gezwungen, genau zu lesen. Kein Erfolg.

Es funktioniert wie erwartet für eine gute Mehrheit meiner Mediendateien. Einige ausgewählte Audiodateien können jedoch keine Audioeigenschaften zurückgeben (der Rest der Tag-Informationen ist in Ordnung!). Die exakt gleichen Audioeigenschaften werden ohne Probleme in TagLib # zurückgegeben.

Irgendwelche Ideen werden geschätzt. Vielen Dank.

Hat jemand noch mehr Ideen, bevor die Bounty endet?

Antwort

5

Hallo es einen Patch zu taglib ist, der die Länge in Millisekunden berechnen, addiert dieser Typ eine Methode (lengthMilliseconds()), die die Länge in Millisekunden zurückkehren, vielleicht für Sie nützlich sein könnten: http://web.archiveorange.com/archive/v/sF3Pjr01lSQjsqjrAC7L

+0

Vielen Dank, ich werde es überprüfen. – jocull

+0

Ich habe den Patch ausprobiert, es hat mein Problem von null Sekunden nicht gelöst, und es hat auch alle meine WMA- und MP4/M4A-Dateien durcheinander gebracht und sie als Sekunden zurückgebracht. Trotzdem danke. Gibt es einen guten Platz, an dem ich Patches oder offene Probleme für TagLib durchsuchen kann? – jocull

+0

Ich weiß es wirklich nicht, ich habe diesen Patch mit Google gefunden. –

3

In TagLib # ist das Parsen von Audiodateien seit der Portierung sehr viel verändert worden, daher ist es schwer zu sagen, wo genau der Unterschied auftreten würde. Sie können Ihr C++ - Programm auf Debug-Meldungen überprüfen.

Meine Vermutung ist, dass der Unterschied darin besteht, wie die beiden Bibliotheken auf ungültige Header reagieren. Es scheint, dass TagLib keine Audioeigenschaftswerte berechnet, wenn der erste gefundene Frame-Header ungültig ist. TagLib # hingegen sucht nach dem ersten gültigen Header in den ersten 16KiB des Audioteils der Datei. Wenn der erste gefundene Header beschädigt ist, wird nach dem nächsten gesucht. Wenn ich mich richtig erinnere, könnte ein falsch gespeichertes ID3v2-Tag dazu führen, dass 0xFF FF FF FF am Anfang des Audioabschnitts der Datei erscheint. Dies würde den oben beschriebenen Fehlertyp auslösen.

Das Problem ist in Zeile 166 der Taglib/mpeg/mpegproperties.cpp. Dies könnte mit dem gleichen Ansatz wie in den Zeilen 171 bis 191 gelöst werden, aber Sie möchten den Code aktualisieren, um nach einem Punkt aufzuhören, falls es sich wirklich nicht um eine MP3-Datei handelt.

1

Zum jetzigen Zeitpunkt unterstützt TagLib 1.11 BETA 2 nativ die Länge des Audiomaterials in Millisekunden. Sie können dies mit dem folgenden Code tun:

TagLib::FileRef f(path); 
int lengthInMillis = f.audioProperties()->lengthInMilliseconds(); 
Verwandte Themen