Hinweis: An dieser Stelle stand eine ganze Zeitlang ein anderer Beitrag. Im Laufe der Zeit habe ich diese Methode weiterentwickelt, Fehler ausgemerzt, große Teile neu oder umgeschrieben und die Verwendung vereinfacht. In der alten Fassung war immer noch eine gewisse Beschäftigung mit der Materie "mp3-Datei" nötig - das ist jetzt nicht mehr so.
Die alte Methode habe ich als .pas Datei im Anhang angefügt - kompilierfähig ist sie so aber nicht (es ist einfach nur ne Kopie des alten Beitrags). Dies nur für den unwahrscheinlichen Fall, dass sie noch von jemandem gebraucht wird.
In Absprache mit den Bibliothekaren habe ich diesen Beitrag hier komplett neu geschrieben.
Grundlage hierfür ist die Unit MP3FileUtils (die sich übrigens u.a. aus dem alten FAQ-Beitrag entwickelt hat). Diese Unit liest aus einem MP3File die ID3-Tags und die MPEG-Audio-Eigenschaften aus. Diese Unit steht unter der LGPL, daher unterliegt die Software, die diese Unit verwendet, gewissen Einschränkungen.
Man könnte hier auch einfach andere ID3- und MPEG-Units verwenden (ggf. muss man den dann Code leicht modifizieren oder einige Properties löschen), die ggf. nicht unter der LGPL oder Lizenzen mit ähnlichen Einschränkungen stehen.
Als Alternativen seien hier UltimaTag von tommie-lie oder die AudioToolsLibrary genannt (allerdings stehen auch diese unter der LGPL).
Die hier vorgestellte Klasse TAudioFile darf aber beliebig verwendet, modifiziert und verbreitet werden. Insbesondere dürfen weitere "GetXXXInfo"-Proceduren eingefügt werden.
Die Frage "Wie ermittle ich den Titel einer mp3-Datei?" ist insofern nicht ganz so einfach zu beantworten, weil in vielen mp3-Files der Titel und andere Infos zweimal gespeichert wird, und beide Versionen müssen nicht übereinstimmen. Es gibt einmal den ID3Tag in der Version 1, und dann gibt es den ID3Tag in der Version 2.
Dass es gewisse Unterschiede bei den Tags gibt, kann man z.B. dann bemerken, wenn eine mp3-CD im Mediaplayer "schöne Titel" hat, aber das Display des Autoradios nur den Dateinamen anzeigt, obwohl es eine ID3-Tag-Anzeige hat. Diese beschränkt sich nämlich häufig auf die Version 1, oftmals ist in mp3-Dateien aber nur der weitaus flexiblere v2-Tag vorhanden.
Häufig interessiert es einen aber nicht, ob der Titel nun im ID3v1, oder im ID3v2-Tag steht, oder ob der eine oder der andere enthalten ist. Wenn man z.B. einfach einen Player schreiben möchte, dann möchte man nur den "Titel" wissen, nicht den ID3v1-Titel.
Oftmals ist es sogar egal, ob man gerade ein Mp3-File, oder eine Ogg-Datei abspielt. In beiden Fällen möchte man in seinem Player grundlegende Eigenschaften dieser Audio-Datei ermitteln um diese anzuzeigen.
Ich habe mich daher entschieden, eine Klasse TAudioFile zu schreiben:
Diese Klasse kann natürlich um weitere Eigenschaften erweitert werden, je nachdem, was man so für nötig hält.
Schon hier kann man erkennen, dass ich es darauf angelegt habe, die Klasse einfach erweiterbar zu halten.
Public ist nur eine Routine:
GetAudioData. Diese Routine ruft dann die richtige private-Routine auf, um aus einer Audio-Datei die gewünschten Informationen zu ermitteln - je nachdem, um welchen Dateityp es sich handelt:
Wir beschränken uns hier auf Mp3-Dateien:
Um nun in einer Anwendung den Titel eines Liedes anzeigen zu lassen, genügen vier einfache Zeilen:
Die komplette Unit ist im Anhang, dort sind auch die Konstruktor, Destruktor und die SetNA-Prozedur mit drin. Einfach diese Unit im Projekt-Ordner speichern, in die Uses-Klausel aufnehmen und benutzen. Einfacher gehts kaum, oder?
Außerdem benötigt wird die Unit
MP3FileUtils.
Oel ngati kameie.