![]() |
Mp3FileUtils
MP3FileUtils, v0.6
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:
Änderungen in 0.6:
Evtl. benötigte Zusatzkomponenten/Units: Nur für Delphi 2007 oder früher. Verwendung kann in der Datei Config.inc geändert werden.
Edit: Text an die neue Version angepasst. |
Re: Mp3FileUtils
Hi Gausi, super Arbeit, hat mir letzte Nacht eine Menge Tipparbeit gespart, vielen Dank.
Gruß René |
Re: Mp3FileUtils
Gewissermaßen als Nebenprodukt bei der Weiterentwicklung meines
![]() Warum es diesmal direkt zwei Varianten gibt, ist etwas schwer zu erklären. Der Unterschied kommt nur dann zum Vorschein, wenn man auch "exotische" MP3-Dateien damit bearbeiten will. Also z.B. koreanische, russische oder hebräische. Benutzen die ID3v2Tags Unicode für die Textinformationen, so sind beide Versionen gleichwertig. Benutzen sie aber den lokalen Zeichensatz (was eigentlich nicht so sein sollte), dann kann die INT-Version diesen entsprechend konvertieren - entweder so, wie es der User vorgibt (vorausgesetzt ist eine passende Eingabemöglichkeit für die Option im Programm), oder aber bis zu einem gewissen Grad automatisch anhand des Dateinamens (wenn dieser Unicode-Zeichen enthält, und gewisse Parameter übergeben werden, die der User der Endanwendung ebenfalls eingeben können sollte). Dafür ist aber eine recht umfangreiche De- und Entkodierungs-Unit nötig, die alleine das Programm um ca. 200-300kb größer macht. Daher gibt es auch eine abgespeckte Version. Ich hoffe, dass es die Demos den Unterschied klar machen, und wenn nicht, dann hilft evtl. ein Blick in die mp3s mit einem Hexeditor. Wichtig dabei ist die "00" oder die "01" unmittelbar vor den Textinformationen. (Also in den Demo-mp3s das siebte Byte nach den Frame-IDs "TIT2", "TPE1", "COMM" und "TALB"). Steht da eine "01", kann man die WE-Version benutzen. Steht da eine "00", und dahinter unlesbarer Krempel, dann braucht man die INT-Version. Für "einheimische mp3s" reicht die WE-Version locker aus und bietet keinen Voreil gegenüber der INT-Version. Download wie immer im ersten Beitrag. |
Re: Mp3FileUtils
Hallo Gausi,
warum löst du das nicht über einen Compilerschalter. Dann kann jeder entscheiden was er haben möchte und du hast nur eine Codebasis. War nur so eine Idee... Gruss Thorsten |
Re: Mp3FileUtils
Mist. Ich hab mir doch gedacht, dass das bestimmt irgendwie einfacher geht.
Werde ich vielleicht mal ausprobieren ;-) |
Re: Mp3FileUtils
Da ich ja Konkurrenz zu meiner Library wittere, musste ich gleich mal schnuppern gehen wie du es so gelöst hast. Erstmal natürlich der grosse Vorteil, dass du auch die ID3v2.2.x.x Tags mit verarbeitest im Gegensatz zu meiner Library (muss ich hier mal erwähnen). Aber eine Frage habe ich: Wozu dient die Procedure "StreamToStream()"? Warum nutzt du nicht einfach TStream.CopyFrom()?
Ansonsten: Gute Arbeit! :thumb: |
Re: Mp3FileUtils
Die Dateizugriffsroutinen habe ich von der "Vorgänger-Unit" UltimaTag von tommie-lie übernommen (Links dazu finden sich im Kommentar der Unit). Also der Teil, der für das neue Schreiben in die Datei verantwortlich ist: alten id3v2Tag entfernen/überschreiben, ggf. die Audiodaten in einem temp-File cachen und hinterher wieder alles zusammenbauen. StreamToStream ist also nicht von mir, sondern von tommie-lie. Auch einige andere Dinge wie die Int28-Int32-Konvertierungen sind von ihm. Seine Teile kann man in der Regel an den englischen Kommentaren erkennen ;-). Ich musste nur einiges ändern, weil in Ultima-Tag (genauso wie in der ATL), nur bestimmte Informationen gelesen wurden, und nur diese dann in der Version 2.3 wieder geschrieben wurden. Da ich unbekannte Frames auf jeden Fall erhalten wollte, blieb mir nichts anderes übrig, als Schreibunterstützung für alle drei Subversionen zu implementieren. Mehr hab ich eigentlich gar nicht gemacht (obwohl das ne Menge Arbeit war :roll: ).
Den Teil mit dem Kopieren habe ich bei der Entwicklung unangetastet gelassen. Zuerst, weil mir das zu kompliziert erschien, und am Ende aus Bequemlichkeit. Das Prinzip erschien mir sinnvoll, und wenn es da andere Methoden zu gibt - kann sein. :) |
Re: Mp3FileUtils
Jemand in nem anderen Forum hat nen einigermaßen sehr fiesen Fehler gefunden, der nun behoben ist. Den Hinweis mit den Compilerschaltern hab ich direkt mal mit eingebaut, StreamToStream rausgeschmissen und ein paar andere Kleinigkeiten geändert.
|
Re: Mp3FileUtils
Hallo spreche ich wirklich normalerweise Englisch, so werde ich das übersetzen. Großes Dienstprogramm! Danke. Ich habe ein Problem dennoch. Ich möchte einen oder zwei Rahmen aus einem id3v2 Anhängsel wie TBPM herausziehen, wie würde ich so mit Ihrem Dienstprogramm tun?
|
Re: Mp3FileUtils
Hi,
You cannot extract all information just through properties like Id3v2Tag.Artist, ID3v2Tag.Title, etc.. "Beats per Minute" is one of them. In ID3-Tags, the "beats per minute"-information is stored in a text-frame (as indicated by the "T" in "TBPM"). To get the information from an arbitrary text-frame, you can use the "ID3v2Tag.GetText()"-method. The paramter of this method is a TFrameID, which is declared in ID3v2Frames.pas. For bpm, you should use
Delphi-Quellcode:
Note: This only works in version 0.4 or above, not in 0.3 as posted in this topic. You can download the current version from my
var myBPM: WideString; // or just String
//... myBPM := myId3v2Tag.GetText(IDv2_BPM); ![]() (btw.: "Anhängsel" and "Rahmen" are funny translations for "tag" and "frame" in this context. What did you use for it? Google Translate? :lol:) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz