| Autor |
Nachricht |
Gausi
       

Beiträge: 7461 Erhaltene Danke: 21 Dabei seit: 22.11.2002 Wohnort: Düsseldorf
Win XP, Win 7 D7 PE, RAD Studio 2009 Professional
|
MP3FileUtils, v0.5b
*new* Delphi 2009 ready
Diese Unit liest aus einer MP3-Datei alle (?) gängigen Informationen aus. Wie bei vielen anderen auch wird der ID3v1-Tag gelesen, fast alle Teile des ID3v2-Tags und diverse Informationen über die Datei ansich, wie z.B. Bitrate und Spieldauer.
Download:
- Mp3FileUtils - Quellcode inkl. der Demoprogramme. Zip-Archiv, ca. 555kb
- Demos. - Komplilierte Demo-Programme zum Ausprobieren. Zip-Archiv, ca. 1.9mb
- Zum Thema Unsynchronisation: "Das Gewitterrätsel - Reloaded" (Version 1, Version 2) - Wo war das Gewitter? (Tip: beide Varianten mit dem VLC abspielen und am Scrollbalken spielen
)
Wichtiger Bugfix
Da hatte sich noch ein Array of Char versteckt, was unter Delphi 2009 Probleme machte. Wirkung: ID3v1-Tags konnten nicht gelöscht werden, und beim Schreiben wurde ein zweiter ID3v1Tag an die Datei angehängt. Die Dateien gehen dadurch nicht kaputt, aber das ändert nichts an der Dringlichkeit, die neue Version zu benutzen.
Änderungen:
- Allerlei Zeug mit UnicodeStrings, WideStrings, AnsiStrings und Strings geändert. Läuft jetzt unter Delphi2009 und älteren Versionen.
- Optional verwendbare Zusatz-Unit DIConverters rausgeschmissen und durch eine Windows-API-Funktion ersetzt. Zwar geht dadurch etwas Funktionalität verloren (d.h. einige Codepages werden nicht mehr unterstützt), aber der Code wird kleiner und einfacher. Und da das wahrscheinlich eh keiner benutzt hat, ist das so in Ordnung.
- In diesem Zusammenhang einige (sehr selten verwendete) Methoden und Properties umbenannt.
- Einige Methoden entfernt, die in 0.4 als veraltet markiert waren.
- Für die Engländer unter uns: Property TMpegInfo.Duration hinzugefügt (ist dasselbe wie .Dauer).
- Fehler behoben, der unter Umständen falsch codierte URLs in "Unicode-Dateinamen" erzeugte.
- Fehler behoben, der mit aktiviertem Range-Checking und PaddingSize=0 auftrat.
- Übersetzung der (meisten) Kommentare im Code ins Englische.
Folgendes leisten die in dieser Unit implementierten Klassen:
- TID3v1Tag:
- Lesen und Schreiben des ID3v1-Tags
- Unterscheidung von v1- und v1.1-Tags
- TMpegInfo:
- Lesen/Berechnen der MPEG-Informationen eines mp3-Files - z.B. Bitrate, Channelmode, Samplerate, vbr/cbr, Dauer
- Schnelles Ermitteln der Daten: Auch bei vbr wird die Spieldauer (fast) immer korrekt ermittelt, ohne die ganze Datei lesen zu müssen
- TID3v2Tag:
- Lesen und Schreiben des ID3v2-Tags
- Unterstützung aller existierenden Versionen: v2.2, v2.3 und v2.4
- Unterstützung der Standard-Frames wie Titel, Artist, Album
- Unterstützung einiger weiterer Text-Frames wie orig. Artist, Composer, Mediatype, Encoder
- Lesen und schreiben von Lyrics, Bildern, Bewertungen, URLs
- Lesen und schreiben beliebiger Daten
- Unterstützung von Unsynchronisation, GroupIDs und Datalength-Bytes
- Unterstützung von Unicode
- Unbekannte Frames (~ Informationsfelder) im Tag bleiben erhalten
Für Details verweise ich auf die beiliegende Dokumentation und die verschiedenen Demoprojekte.
Evtl. benötigte Zusatzkomponenten/Units:
Nur für Delphi 2007 oder früher. Verwendung kann in der Datei Config.inc geändert werden.
Für Fehlermeldungen oder Codeoptimierungen bin ich jederzeit offen - hier im Thread, per PN oder per Mail.
Edit: Text an die neue Version angepasst.
_________________ Oel ngati kameie.
Zuletzt bearbeitet von Gausi am So 16.08.09 15:29, insgesamt 15-mal bearbeitet
Für diesen Beitrag haben gedankt: Chatfix
|

|
|
retnyg
       
Beiträge: 2754 Dabei seit: 05.07.2002 Wohnort: .at
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS Delphi 5, Delphi 7
|
der code ist ja riesig ^^
kann mir nicht vorstellen dass das alles benötigt wird....naja
vielleicht könntest du die exe und die 2. kopie der unit weglassen dann wird die datei n stück kleiner
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|

|
|
Gausi
       

(Threadstarter)
Beiträge: 7461 Erhaltene Danke: 21 Dabei seit: 22.11.2002 Wohnort: Düsseldorf
Win XP, Win 7 D7 PE, RAD Studio 2009 Professional
|
retnyg hat folgendes geschrieben: | der code ist ja riesig ^^
kann mir nicht vorstellen dass das alles benötigt wird....naja |
Wenn man den Krempel weglässt, den man zur Unterscheidung der diversen v2-Tag-Versionen weglässt, und den Teil mit Bildern und Lyrics, und ein paar Kommentare, dann kann man sich einiges sparen, ja.
Die eine oder andere Funktion kann man sicherlich noch kürzen/optimieren, aber prinzipiell braucht man das alles. (Ok, die Language-Codes am Ende könnte man weglassen ^^) Wie gesagt: Für Code-Optimierungen bin ich jederzeit offen!
retnyg hat folgendes geschrieben: | | vielleicht könntest du die exe und die 2. kopie der unit weglassen dann wird die datei n stück kleiner |
Zum schnellen Ausprobieren der Demo finde ich eine mitgelieferte exe eigentlich ganz praktisch, und so riesig ist der Download ja nun auch nicht. Selbst mit nem Modem dürfte das in 2 Minuten erledigt sein.
_________________ Oel ngati kameie.
|

|
|
retnyg
       
Beiträge: 2754 Dabei seit: 05.07.2002 Wohnort: .at
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS Delphi 5, Delphi 7
|
auf delphi.about.com gibts nen mp3player mit eingebautem id3-editor zum download, der id3 code ist dort ca. 200 zeilen lang...
weiss jetzt allerdings nicht mehr auswendig, ob damit auch id3v2 funktioniert.
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|

|
|
Luckie
        
Beiträge: 11116 Erhaltene Danke: 8 Dabei seit: 30.08.2002
WindowsXP Professional SP2 BDS2006, VS C++ Express, Eclipse (Java), Flex (Flash, AS)
|
Und ich darf den Moderator noch mal daraufhinweisen, dass man verpflichtet ist, die Unit komplett als Source im Posting zu posten. 
_________________ Gruß Michael
|

|
|
Gausi
       

(Threadstarter)
Beiträge: 7461 Erhaltene Danke: 21 Dabei seit: 22.11.2002 Wohnort: Düsseldorf
Win XP, Win 7 D7 PE, RAD Studio 2009 Professional
|
Der 200 Zeilen Code ist nur id3v1. Dieser ist sehr einfach gehalten und benötigt auch bei mir nicht wesentlich mehr.
@Luckie: Ich weiss. Ich nehme mir auch nicht das Recht heraus, den Code hier nicht direkt zu posten, weil ich Moderator bin, sondern weil der komplette Code sehr lang ist, und der Code auch bei eingeklappten Quelltext-Fenster komplett geladen wird.
Insgesamt hat die Unit gut 130kB, und das möchte ich einem Modem User nur ungern beim Laden einer Webseite zumuten. Daher habe ich von der Einhaltung dieser Regel Abstand gehalten.
Und nochmal zu dem zugegebenermaßen enormen Umfang des Codes: Da steckt auch ne ganze Menge drin. Mir ist bisher keine ID3-Unit über den Weg gelaufen, die alle Sub-Versionen des v2 Tags lesen und schreiben kann und das Lesen und Schreiben von Bildern und Lyrics unterstützt. Selbst die von mir hochgeschätzten AudioTools unterstützen nur v2.3 lesend und schreibend - die anderen Versionen werden nur gelesen. Und nicht erkannte Frames gehen dort beim Speichern verloren. (Zumindest in der Version, die ich kürzlich runtergeladen habe.)
Außerdem denke ich, dass auch die Kommentare recht ausführlich sind.
_________________ Oel ngati kameie.
|

|
|
Daniel G
Hält's aus hier
Beiträge: 7 Dabei seit: 10.09.2005
|
Gausi hat folgendes geschrieben: |
Insgesamt hat die Unit gut 130kB, und das möchte ich einem Modem User nur ungern beim Laden einer Webseite zumuten. Daher habe ich von der Einhaltung dieser Regel Abstand gehalten. |
Dafür dankt dir der Daniel  .
Dolles Ding!
|

|
|
larshgf
Hält's aus hier
Beiträge: 6 Dabei seit: 19.10.2005 Wohnort: Esbjerg - Denmark
Windows XP
|
Hi everybody,
Sorry, but my german language is even vorse than my english.
I just want to thank the creator of this Mp3FileUtils. It's a fantastic work you've done here! I have only programmed a little with the mp3 files as object, and that was only concerning the ID3v1, which is - as you all probably know - a lot simpler than the complex ID3v2 data format.
I wonder if it's possible to build som unicode support into this mp3fileUtils? Maybee with the help from the free TNTWare by Troy Wolbrink in USA. (http://www.tntware.com/delphicontrols/unicode/). Have the author considered to do that?
Kindest Regards
Lars
|

|
|
Gausi
       

(Threadstarter)
Beiträge: 7461 Erhaltene Danke: 21 Dabei seit: 22.11.2002 Wohnort: Düsseldorf
Win XP, Win 7 D7 PE, RAD Studio 2009 Professional
|
Hi,
Yes, there is _some_ unicode support in this Unit. It is possible to read unicode-formatted strings from the tags. These strings are automatically converted to ANSII (or better: I hope they are...  ) - just because the DelphiVCL (without third-party components) has no support for Unicode strings.
I did not found many mp3Files with Unicode-tags (and do not know how to search for them), so this is not well tested.
I tested it with some unicode-files, but the contained chars are only pseudo-unicode - one byte of the two-byte-chars was always $00. I have absolutely no idea what happens, when this is used with japanese or chinese mp3files.
It is (yet) not supported to write Unicode formatted strings to the tag. One of the reasons is: I dont know any taggers with full unicode support, so I cant test wether the things i write to the file are correct. And another: There is afaik no way to type unicode formatted strings into a VCl-component...
_________________ Oel ngati kameie.
|

|
|
oern
        
Beiträge: 142 Dabei seit: 08.08.2005 Wohnort: Krehenfeld
Linux, Win XP D7
|
| Zitat: | | Diese Unit liest aus einer MP3-Datei alle (?) gängigen Informationen aus. Wie bei vielen anderen auch wird der ID3v1-Tag gelesen, einige Teile des ID3v2-Tags und diverse Informationen über die Datei ansich, wie z.B. Bitrate und Spieldauer. |
Wie lese ich denn die Spieldauer aus ? Das find ich irgentwie nicht 
_________________ Ich hab eine Signatur
|

|
|
Gausi
       

(Threadstarter)
Beiträge: 7461 Erhaltene Danke: 21 Dabei seit: 22.11.2002 Wohnort: Düsseldorf
Win XP, Win 7 D7 PE, RAD Studio 2009 Professional
|
Die Dauer steht nicht im ID3 Tag, sondern wird aus den MPEG-Headern ermittelt. Daher steckt die Dauer in den MpegInfos mit drin:
_________________ Oel ngati kameie.
|

|
|
oern
        
Beiträge: 142 Dabei seit: 08.08.2005 Wohnort: Krehenfeld
Linux, Win XP D7
|
Danke klappt wunderbar 
_________________ Ich hab eine Signatur
|

|
|
Ironwulf
       
Beiträge: 719 Dabei seit: 28.03.2005
|
unter delphi 3 kann ich das leider nich compilieren, das einige probleme gibt
z.b. hier:
ich vermute mal das man sowas als dynamischen array bezeichnet="?" kp zumindest kann das mein delphi nit
oder der teil hier:
und mit Longword und Int64 kanns auch nichts anfangene aber ich glaub die könnte man notfalls noch durch normales word und integer ersetzen
gibts da alternativen für oder muss ich mir selbst eine ähnliche unit ausm kopf drücken
|

|
|
Gausi
       

(Threadstarter)
Beiträge: 7461 Erhaltene Danke: 21 Dabei seit: 22.11.2002 Wohnort: Düsseldorf
Win XP, Win 7 D7 PE, RAD Studio 2009 Professional
|
Ja, TBuffer ist ein dynamisches Array, und die gabs bei D3 noch nicht. Evtl. kannst du das so umbauen, dass du da auch ne statische Größe dafür verwenden kannst. Hab das jetzt nicht genau im Kopf, wo ich welche Buffer-Länge brauche. Evtl. nimmst du anstelle eines Types TBuffer mehrere verschiedene, die sich in der Länge unterscheiden.
Die Int64-Variablen kannst du durch Integer ersetzen, bekommst dann aber unter Umständen Probleme bei großen Dateien, die theoretisch möglich sind (die Grenze war da glaube ich 2 oder 4 GB).
Die LongWords könnten Probleme machen, da z.B. die Funktion "Int28ToInt32" auf die interne Struktur des Longwords zurückgreift, um die Werte schnell zu konvertieren. Da musst du dann ggf. diese Routinen ändern, damit hinterher die Größenangaben im ID3v2-Header und den einzelnen Frames stimmt.
Also: das Umbauen auf D3 ist mit Sicherheit möglich, aber nicht trivial.
_________________ Oel ngati kameie.
|

|
|
Jakob Schöttl
       
Beiträge: 929 Dabei seit: 08.01.2006 Wohnort: Otterfing
Windows XP, Windows Server 2008 Delphi 7 Prof., Turbo Delphi 2006
|
Sehr gut!
Ich hab nur eine Frage dazu: Wenn ich nicht weiß, ob meine mp3 version 1 oder 2 ist, was mach ich dann. Zeigt Id3v2Tag auch die Tags einer Version 1 an?
|

|
|
Gausi
       

(Threadstarter)
Beiträge: 7461 Erhaltene Danke: 21 Dabei seit: 22.11.2002 Wohnort: Düsseldorf
Win XP, Win 7 D7 PE, RAD Studio 2009 Professional
|
Nein. ID3v1 und v2 sind ja nicht nur einfach unterschiedliche Versionen ein und deselben Dings, sondern vollkommen unterschiedlich in ihrem Aufbau, Umfang, und vor allem auch erstmal ihrer Position in der Datei.
Daher kann TID3v2Tag die Tags der Version 1 nicht anzeigen, da die beiden nichts gemeinsam haben (wenn man mal davon absieht, dass beide Konstrukte zur Speicherung gewisser Informationen genutzt werden). Das macht auch eigentlich keinen Sinn, denn:
Es können in einer mp3-Datei immer auch beide Versionen vorhanden sein - v2 am Anfang, und v1 am Ende der Datei. Ob und welche Tags vorhanden sind, kann man mit dem Exists-Flag abfragen, der True ist, wenn der Tag vorhanden ist.
Für eine bloße Anzeige der Meta-Informationen (z.B. in einem mp3-Player) ist evtl. dieser Beitrag noch hilfreich, wo ein System vorgestellt wird, das sich auch recht leicht auf andere Dateitypen (ogg, wma,..) erweitern lässt, ohne den eigentlichen Code des Players später verändern zu müssen.
Bei einen Tag-Editor sollte man einstellen können, welche Version (ggf. beide oder nur die vorhandene(n)) geschrieben werden soll. Außerdem ist da eine separate Anzeige beider Tags sinnvoll.
Nochwas: Deine "mp3 Version" dürfte fast immer 1 sein - aber das hat mit dem ID3-Tag nichts zu tun, sondern mit dem MPEG-Codec dahinter. Und der dürfte in 99% aller Fälle MPEG1, Layer 3 sein 
_________________ Oel ngati kameie.
|

|
|
Jakob Schöttl
       
Beiträge: 929 Dabei seit: 08.01.2006 Wohnort: Otterfing
Windows XP, Windows Server 2008 Delphi 7 Prof., Turbo Delphi 2006
|
Ok, Vielen dank!
der Link hat mir schon geholfen. Ich muss mir den Quellcode noch genauer anschauen, vielleicht kann ich dann auch diese AudioTags schreiben, nicht nur lesen.
|

|
|
Gausi
       

(Threadstarter)
Beiträge: 7461 Erhaltene Danke: 21 Dabei seit: 22.11.2002 Wohnort: Düsseldorf
Win XP, Win 7 D7 PE, RAD Studio 2009 Professional
|
Zum schreiben kannst du die Routinen aus Mp3FileUtils benutzen. Wie man die benutzt, sollte in dem Demo-Projekt klar werden. Das Vorgehen sollte prinzipiell so sein:
- Lesen des alten Tags aus der Datei,
- Setzen/Ändern der Informationen,
- Schreiben in die Datei.
Zuerst Lesen ist deshalb dringend empfohlen, weil im ID3v2Tag jede Menge Informationen stecken können, die nicht "standard" sind. Diese würden verloren gehen, wenn du einfach einen neues Objekt TID3v2Tag erstellst, mit ein paar Informationen füllst und dann in die Datei reinschreibst.
Wenn du zuerst das vorhandene aus der Datei ausliest und dann einige Sachen änderst, bleiben die anderen Informationen erhalten.
_________________ Oel ngati kameie.
|

|
|
Jakob Schöttl
       
Beiträge: 929 Dabei seit: 08.01.2006 Wohnort: Otterfing
Windows XP, Windows Server 2008 Delphi 7 Prof., Turbo Delphi 2006
|
Ja, aber mein Problem ist ja auch wieder, dass ich nicht weiß, wann ich TId3v1Tag und TId3v2Tag zum schreiben der Tags nehmen muss. Wenn ich das wüsste, könnte ich ja auch gleich mit diesen Objekten die Tags lesen.
|

|
|
Gausi
       

(Threadstarter)
Beiträge: 7461 Erhaltene Danke: 21 Dabei seit: 22.11.2002 Wohnort: Düsseldorf
Win XP, Win 7 D7 PE, RAD Studio 2009 Professional
|
Hmmm...ich versuche, es mal von Anfang an zu erklären. Also. Eine mp3-Datei sieht - sehr stark vereinfacht - so aus:
Wenn du nun bei einer gegebenen mp3-Datei den ID3-Tag in der Version 1 auslesen willst, dann geht das mit dieser Klasse hier ganz einfach so:
Version 2 geht ganz analog:
Wenn du wissen willst, ob überhaupt ein ID3-Tag vorhanden ist, kannst du anschließend sowas machen:
Zum Schreiben kannst du dann entweder den Tag nehmen, der schon vorhanden ist, oder einfach immer v1 oder immer v2 nehmen. Das is vollkommen egal. Beide Tags können in jede mp3-Datei geschrieben werden. Es muss keiner geschrieben werden, und welche Version, ist vollkommen dir (bzw. besser dem User) überlassen.
Ein meinID3v2Tag.WriteToFile('c:\meinmp3.mp3') schreibt das Objekt an den Anfang der Datei genauso wie ein meinID3v1Tag.WriteToFile('c:\meinmp3.mp3') ein etwas anders aufgebautes Objekt ans Ende schreibt. Das die Informationen in diesen Objekten, die da geschrieben werden, einigermaßen sinnvoll sind, dafür ist der Programmierer der Enduser-Software verantwortlich. Es ist mit den Methoden aus MP3FileUtils durchaus so etwas möglich:
Aber ob das nun sinnvoll ist, ist eine ganz andere Frage. Das Ergebnis wäre hier wahrscheinlich, dass die Datei im Autoradio als "eine kleine nachtmusik" erscheint, und in Winamp als "Hänschen klein", obwohl beidesmal "Nothing else matters" gespielt wird.
Daher empfiehlt sich z.B. sowas:
Alternativ zu den letzten beiden Zeilen kann man auch sowas machen:
Ich hoffe, es wird langsam etwas klarer 
|

|
|
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
|
|
|
|
|