Frage

Ich bin gerade dabei, meine C # Anwendung über zu Qt / C ++ zu bewegen. Ich laufe Probleme mit Längen von TagLib. Ich finde es seltsam, dass TagLib # kehrt Audio-Dauern in Millisekunden, während TagLib seine (falsche) Dauer in Sekunden zurück. TagLib gerade Rückkehr Null für die Längenwerte, während TagLib # korrekt bleibt.

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 gezwungen es sogar genau zu lesen. Kein Erfolg.

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

Es funktioniert wie eine gute Mehrheit meiner Mediendateien erwartet. Doch ein paar ausgewählte Audiodateien nicht alle Audio-Eigenschaften zurückzukehren (der Rest der Tag-Informationen liest in Ordnung!). Die exakt gleiche Audio-Eigenschaften werden ohne Probleme auf TagLib # zurückgegeben.

sind Irgendwelche Ideen geschätzt. Danke.

Hat jemand noch mehr Ideen, bevor die Prämie endet?

War es hilfreich?

Lösung

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

Andere Tipps

Es hat sich viel in TagLib # 's Analyse von Audiodateien geändert, da es ursprünglich portiert wurde, so ist es schwer zu sagen, wo genau der Unterschied auftreten würde. Sie können Ihr C ++ Programm für Debug-Meldungen überprüfen.

Meine Vermutung ist, dass der Unterschied in ist, wie die beiden Bibliotheken ungültiger Header reagieren. Es scheint, dass, wenn der erste Frame-Header findet es ungültig ist, TagLib werden keine Audio-Eigenschaftswerte berechnen. TagLib #, auf der anderen Seite, sucht nach den ersten gültigen Header in der ersten 16KiB des Audio-Teils der Datei. Wenn der erste Header trifft es beschädigt ist, wird es für die nächsten scannen. Wenn ich mich richtig erinnere, ein falsch gespeichert ID3v2-Tag in 0xFF FF FF FF erscheint am Anfang des Audio-Abschnitts der Datei führen könnte. Dies würde die Art des Fehlers auslösen oben beschrieben.

Das Problem ist in Zeile 166 von taglib / mpeg / mpegproperties.cpp. Diese gelöst werden, um den gleichen Ansatz wie Linien 171-191, aber Sie würden den Code geben nach einem Punkt im Fall aktualisieren mögen es keine MP3-Datei wirklich ist.

Zum Zeitpunkt des Schreibens, TagLib 1.11 BETA 2 nativ unterstützt die Länge des Audio-in Millisekunden zu bekommen. Sie können mit dem folgenden Code so tun:

TagLib::FileRef f(path);
int lengthInMillis = f.audioProperties()->lengthInMilliseconds();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top