Delphi-PRAXiS
Seite 1 von 9  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Mp3FileUtils (https://www.delphipraxis.net/71449-mp3fileutils.html)

Gausi 15. Jun 2006 13:23


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:
  • 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" (das war mal eine Aufwärmfrage bei einem Gewinnspiel in der Entwickler-Ecke) (Version 1, Version 2) - Wo war das Gewitter? (Tip: beide Varianten mit dem VLC abspielen und am Scrollbalken spielen ;-))

Änderungen in 0.6:
  • Methoden SetRating und SetPersonalPlayCounter zusammengefasst zu SetRatingAndCounter. Der Code in den eigenen Anwendungen muss da ggf. angepasst werden
  • Unterstützung von "Private Frames"
  • Erkennung des VBRI-Header
  • ein paar neue Genres in der Genre-Liste für ID3v1
  • neue Methoden Get/SetUserText, GetAllUsertextFrames
  • ID3v2Tag.ReadfromStream schneller: Tag wird zuerst komplett geladen, aus dem Memorystream dann die Einzelframes
  • Bugfix: Korrektes Lesen von UTF8-kodierten Textframes mit Delphi 2009
  • Bugfix: ExtendedHeader-Größe wurde falsch interpretiert
  • Bugfix: User-definierte Textframes (TXXX) haben eine andere Struktur als normale Textframes
  • Bugfix: Typ-Gemisch bei GetFrameLength behoben
Folgendes leisten die in dieser Unit implementierten Klassen:
  1. TID3v1Tag:
    • Lesen und Schreiben des ID3v1-Tags
    • Unterscheidung von v1- und v1.1-Tags
  2. 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
  3. 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.

drschubi 16. Jun 2006 11:06

Re: Mp3FileUtils
 
Hi Gausi, super Arbeit, hat mir letzte Nacht eine Menge Tipparbeit gespart, vielen Dank.

Gruß René

Gausi 14. Aug 2006 14:44

Re: Mp3FileUtils
 
Gewissermaßen als Nebenprodukt bei der Weiterentwicklung meines MP3-Players ist eine neue Version dieser Unit entstanden.

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.

omata 14. Aug 2006 16:49

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

Gausi 14. Aug 2006 17:13

Re: Mp3FileUtils
 
Mist. Ich hab mir doch gedacht, dass das bestimmt irgendwie einfacher geht.

Werde ich vielleicht mal ausprobieren ;-)

Muetze1 15. Aug 2006 00:12

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:

Gausi 15. Aug 2006 08:50

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. :)

Gausi 12. Feb 2007 19:52

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.

DmVinny 3. Apr 2009 07:03

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?

Gausi 3. Apr 2009 11:24

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:
var myBPM: WideString; // or just String
//...
myBPM := myId3v2Tag.GetText(IDv2_BPM);
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 webpage. I will edit this topic soon. ;-)

(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 19:08 Uhr.
Seite 1 von 9  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz