AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Mp3FileUtils

Mp3FileUtils

Ein Thema von Gausi · begonnen am 15. Jun 2006 · letzter Beitrag vom 22. Jun 2013
Antwort Antwort
Seite 1 von 9  1 23     Letzte » 
Benutzerbild von Gausi
Gausi
Registriert seit: 17. Jul 2005
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.
The angels have the phone box.

Geändert von Gausi (30. Jun 2011 um 19:37 Uhr)
 
drschubi
 
#2
  Alt 16. Jun 2006, 11:06
Hi Gausi, super Arbeit, hat mir letzte Nacht eine Menge Tipparbeit gespart, vielen Dank.

Gruß René
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

 
Delphi 11 Alexandria
 
#3
  Alt 14. Aug 2006, 14:44
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.
  Mit Zitat antworten Zitat
omata

 
Delphi 7 Enterprise
 
#4
  Alt 14. Aug 2006, 16:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

 
Delphi 11 Alexandria
 
#5
  Alt 14. Aug 2006, 17:13
Mist. Ich hab mir doch gedacht, dass das bestimmt irgendwie einfacher geht.

Werde ich vielleicht mal ausprobieren
  Mit Zitat antworten Zitat
Muetze1
 
#6
  Alt 15. Aug 2006, 00:12
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!
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

 
Delphi 11 Alexandria
 
#7
  Alt 15. Aug 2006, 08:50
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 ).

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.
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

 
Delphi 11 Alexandria
 
#8
  Alt 12. Feb 2007, 19:52
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.
  Mit Zitat antworten Zitat
DmVinny
 
#9
  Alt 3. Apr 2009, 07:03
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?
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

 
Delphi 11 Alexandria
 
#10
  Alt 3. Apr 2009, 11:24
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? )
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr.
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