Delphi-PRAXiS
Seite 1 von 3  1 23      

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

DmVinny 3. Apr 2009 17:47

Re: Mp3FileUtils
 
LOL, Thank you for the quick response. And yes I did use google translate, I was in need of the information and I did not know if you spoke english. But I am glad you do, and understood what I meant.

Ty

DmVinny 9. Apr 2009 05:25

Re: Mp3FileUtils
 
Ignore post, figured out, thank you anyway.

Gausi 9. Apr 2009 15:08

Re: Mp3FileUtils
 
Da das Jahr 2009 langsam voranschreitet, und die Zahl der Delphi2009-Nutzer langsam zunimmt, habe ich mich mal hingesetzt, und die Unit fit fürs neue Delphi gemacht. Ein paar weitere Änderungen wurden auch vorgenommen, an den Grundlagen der Verwendung hat sich aber nichts geändert.

Die oben verlinkten Demos sind aktuell mit der 2009 Trial compiliert, das werde ich ändern, wenn die Vollversion da ist.

Garfield 10. Apr 2009 10:34

Re: Mp3FileUtils
 
Zitat:

Zitat von Gausi
Die oben verlinkten Demos sind aktuell mit der 2009 Trial compiliert, das werde ich ändern, wenn die Vollversion da ist.

Sollte nicht notwendig sein.

Gausi 10. Apr 2009 10:57

Re: Mp3FileUtils
 
Kann sein, aber mich hat dieser Teil in den Lizenzbestimmungen etwas stutzig gemacht:
Zitat:

2.2 Lizenz für Testversionen
[...]
PROGRAMME, DIE SIE WÄHREND DES EVALUIERUNGSZEITRAUMS ERSTELLT HABEN, BENÖTIGEN DAS PRODUKT MÖGLICHERWEISE FÜR DIE AUSFÜHRUNG. NACH ABLAUF DES EVALUIERUNGSZEITRAUMS FUNKTIONIEREN DIESE PROGRAMME MÖGLICHERWEISE NICHT MEHR.
Ich werde es ja in 20 Tagen sehen, was dann passiert. Außerdem gibt es ja auch eine Interpretation von "kommerzieller Nutzung", die in der Veröffentlichung von Software außerhalb von Foren wie diesem hier einen kommerziellen Nutzen in Form von Werbung sieht. Von daher würde die Veröffentlichung auf meiner Seite gegen die Lizenzbestimmungen der Trial verstoßen. Aber da die Vollversion bestellt ist, und die Programme in der Form relativ geringen Nutzwert haben, würde ich sagen, dass man da ein Auge zudrücken kann. ;-)

Garfield 11. Apr 2009 08:18

Re: Mp3FileUtils
 
Ich habe im September ein Programm mit der Trial compiliert. Das läuft immernoch. Die Trial ist nicht mehr installiert.

SearchBot 3. Mai 2009 23:32

Re: Mp3FileUtils
 
LOL, ich habe den Code der 0.4 auf Delphi4 runter-kompatibititiert - zumindest bekomme ich keine Fehlermeldungen mehr, daß es die Arrays nicht kapiert und so.

Ich brauche die Utils nur, um die Liedlänge rauszufinden. Das klappt bei allen MP3s sehr gut, außer sie sind mit 320kBit/s kodiert.

Hat jemand eine Ahnung, wie man auch bei den 320ern die korrekte Spieldauer herausfindet?

Gausi 4. Mai 2009 06:42

Re: Mp3FileUtils
 
Normalerweise sollte das auch mit 320ern richtig klappen, zumindest habe ich bei mir bisher keine nennenswerten Abweichungen gefunden (+/- eine Sekunde kann schonmal vorkommen, wenn noch unbekannte Tags in der Datei sind). Wenn die Abweichungen größer sind, würde ich mich über eine Beispieldatei per Mail (mail ÄTT gausi PUNKT de) freuen - ich schau mir das dann mal genauer an.

SearchBot 4. Mai 2009 22:45

Re: Mp3FileUtils
 
Hallo,
ich hab dir ne Mail mit etlichen Links geschickt; eine ganz extreme davon ist diese hier (für alle anderen mal zu selber testen):
Download: Spellbound
Bitrate: 320
Windows erkennt diese Zeit: 4.30
Unit erkennt diese Zeit (min.sec): 18.05

Muetze1 5. Mai 2009 00:46

Re: Mp3FileUtils
 
Da ich an dem Problem auch länger gesessen hatte, musste ich doch glatt mal nachschauen: meine ID3 Lib sagt mir bei dem Song 4:30. Gausi, ich kann dir nur nochmals anbieten den Code der Lib von mir auszuschlachten.

Gausi 5. Mai 2009 06:57

Re: Mp3FileUtils
 
Hm, meine Unit sagt mir bei diesem Link auch 4:30 (bzw. 271 sec, aber ich weiß da grade nicht genau, wie genau die Millisekunden gerundet werden. ;-)) Aber: die sind nicht 320kbit/s kodiert, sondern mit einer variablen Bitrate. Werden bei dir auch mit den originalen Versionen fehlerhafte Infos ausgegeben, oder liegt das an deiner Modifikation? :gruebel:

Auch die anderen Dateien, die du in der Mail verlinkt hast, werden sowohl in meinem Player, als auch in dem Testprogramm richtig erkannt. Mit einer einzigen Ausnahme. Und da steckt kein Xing-Header drin, sondern ein VBRI-Header, der mir bisher nicht bekannt ist. In Muetze1's Lib wird der wohl erkannt und verarbeitet), ich werde mich da mal schlau machen, wie das Ding funktioniert. ;-)

Muetze1 5. Mai 2009 08:39

Re: Mp3FileUtils
 
Ich habe mich damals auf diesen Artikel gestützt und das SDK vom Fraunhofer IIS, da der VBRI Tag von deren Encodern kommt.

SearchBot 7. Mai 2009 00:39

Re: Mp3FileUtils
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich weiß jetzt nicht, ob meine Modifikation daran schuld ist - den Originalcode kann ich in Delphi4 nicht nutzen, weil der Compiler keine Mengen mit Initialwert (hier fett) kennt (also zB den Typ TID3v2FrameVersions = (FV_2 = 2, FV_3, FV_4);), darum hab ich dies Ding einfach erweitert, und dabei warscheinlich kaputtgedacht (aber wie hätte ich das sonst auf FV_2=2 bringen sollen? ...

Die Bitraten hat mir WinXp beim Draufzeigen auf das Mp3 gezeigt, ob variabel oder nicht hat mir Windows nicht angezeigt ;(

Hier meine Mods für Delphi4 angehängt (basiert auf der v0.4):

himitsu 7. Mai 2009 01:05

Re: Mp3FileUtils
 
:angel2:
Delphi-Quellcode:
TID3v2FrameVersions = (FV_dummy0, FV_dummy1, FV_2, FV_3, FV_4);

Satty67 7. Mai 2009 07:54

Re: Mp3FileUtils
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
TID3v2FrameVersions = (FV_dummy0, FV_dummy1, FV_2, FV_3, FV_4);

Funktioniert nicht, hatte auch versucht die MP3FileUtils auf D5 so anzupassen. Da wird auch noch die größe der Aufzählung irgendwo abgefragt... ist nur schon zu lange her und der Code liegt daheim irgenwo rum ;)

Aber von Dir kam in einem anderen Thread ein Vorschlag der funktioniert:

FV_2, FV_2 etc. als Konstanten deklarieren und TID3v2FrameVersions als Word oder Byte...

Gausi 7. Mai 2009 09:35

Re: Mp3FileUtils
 
@muetze1: Danke, werde mir das mal anschauen. Der Herr Gugl hat mir die Seite auch schon empfohlen. ;-)

@TID3v2FrameVersions: Daran dürfte die falsche Längenerkennung aber nicht liegen. Die Dauer hat ja mit dem ID3-Tag nichts zu tun. Was da genau schief geht, kann ich mangels vorhandener D4/D5-Installation leider nicht sagen. :(

himitsu 7. Mai 2009 09:55

Re: Mp3FileUtils
 
eventuell sind dann die Größen einiger Typen unterschiedlich, weßhalb dann was nicht mehr richtig gelesen wird?

von der Definition her und unter ignorieren der Dummy-Werte ist beides eigentlich identisch
Delphi-Quellcode:
TID3v2FrameVersions = (FV_2=2, FV_3, FV_4);
TID3v2FrameVersions = (FV_dummy0, FV_dummy1, FV_2, FV_3, FV_4);
Jetzt kann nur noch des/der Enums und Recordausrichtung unterschiedlich sein.

Satty67 7. Mai 2009 10:59

Re: Mp3FileUtils
 
gleich ein paar Zeilen drunter wird bei der Dummy-Declarierung hier gemeckert:
Delphi-Quellcode:
const TFrameFlagValues : Array [TID3v2FrameVersions] of Array [TFrameFlags] of Byte =
Man muss halt mehr anpassen. Das setzen der Dummys alleine reicht nicht aus.

himitsu 7. Mai 2009 11:30

Re: Mp3FileUtils
 
joar, entweder noch 2 Dummy Bytes hinten mit rein, oder besser noch

Delphi-Quellcode:
const TFrameFlagValues : Array [FV_2..FV_4]

Satty67 7. Mai 2009 11:36

Re: Mp3FileUtils
 
Wird aber als [0..2] gewertet und original Deklaration als [2..4]?

Naja...egal anpassen an Delphi5 (und wohl auch 3/4) geht, man muss halt etwas Handarbeit investieren.

€: Die aktuelle Id3v2Frames.pas ist nicht CR+LF kodiert?

SearchBot 8. Mai 2009 16:53

Re: Mp3FileUtils
 
Zitat:

Zitat von Satty67
anpassen an Delphi5 (und wohl auch 3/4) geht, man muss halt etwas Handarbeit investieren.

Ja, hab ich gemacht; siehe DL oben, da sind die Units drin (v0.4) - ich musste einiges um diese beiden Dummys erweitern, aber dann hat es auf Anhieb geklappt!

@Gausi...
Ooouh - ich bin sooooo blöööd. :nerd:
Ich habe zwar aus den Utils die Zeit für das Mp3 ermittelt und in einer Variablen abgelegt, aber in einer anderen Procedure nicht aus dieser Variable verwendet, sondern die Tracklength vom Mediaplayer - :nerd: - und der hat es immer falsch erkannt (ist auch blöd, wenn ich meine Variable auch TrackLength nenne, wenn die vom Mediaplayer genauso heißt, ich Depp)!

Alle Aufregung umsonst - sorry sorry sorry sorry sorry sorry sorry sorry sorry sorry sorry sorry sorry sorry und nochmal sorry. :nerd:

Gausi 16. Aug 2009 14:37

Re: Mp3FileUtils
 
Der VBRI-Header ist zwar noch nicht drin, trotzdem der Hinweis auf eine neue Version.

Unter Delphi 2009 gab es Probleme mit dem ID3v1-Tag, der durch ein Char-AnsiChar-Dingens weder gelöscht noch überschrieben werden konnte. Beim Speichern wurde dadurch immer wieder ein neuer Tag (also 128 Bytes) an die Datei angehängt. Das hat die Datei zwar nicht beschädigt, was ihre Abspielbarkeit betrifft, ist aber dennoch äußerst unschön.

Z4ppy 16. Jan 2011 02:07

AW: Mp3FileUtils
 
Ich habe folgendes festgestellt:
Die Dauer, die TMpegInfo zurückgibt, stimmt mit der Angabe im Explorer überein, nicht aber mit der in Winamp und iTunes.
Die Angaben sind zum Teil ziemlich weit auseinander: bei Iron Maiden - Remember Tomorrow zeigen mir beispielsweise TMpegInfo und Explorer 5:48 an, bei Winamp und iTunes ist der Song nur 5:28 lang :cry:
Weisst du, woran das liegen könnte? Sind die Dateien eventuell fehlerhaft?

MfG Z4ppy

€dit: Interessant ist übrigens: über die SendMessage API von Winamp bekommt man wieder den höheren Wert, intern zeigt Winamp aber den niedrigeren an :lol:

Gausi 16. Jan 2011 09:23

AW: Mp3FileUtils
 
Es gibt immer wieder mal solche Fälle, wo meine Unit (oder auch mal andere Programme) falsche Werte liefern. Das kann unterschiedliche Ursachen haben: Eine wäre die falsche Erkennung von "variable Bitrate", z.B. durch defekte Xing-Header oder die VBRI-Header, die ich bisher nur in meiner lokalen Version erkennen kann.

Spontan würde ich hier auf einen sehr großen ID3v2-Tag tippen, aber da kann ich mich auch irren. Schick mir so eine Datei am besten mal per Mail, dann kann ich mir die mal genauer angucken. :)

Adresse ist mail<Ät>gausi<Punkt>de

DelTurbo 30. Jun 2011 13:17

AW: Mp3FileUtils
 
Hi,
leider habe ich ein Problem mit den Demos. Ich nutze Demo_ID3v2_Level2.exe um ein Bild anzuhängen. In der "orginal" Demo-Exe klappt es auch.

Bei dem Demo-Sourcecode der dabei ist, klappt es nicht. Es klappt nur wenn vorher schon ein Bild enthalten war. Möchte man ein mp3 um ein Bild erweitern, dann klappt es nur mit der "orginal" Demo_ID3v2_Level2.exe.

Wäre toll wenn mir einer helfen würde.

Danke im voraus

EDIT: Ich habe ein bissl getraced. GetPictureFrameIndex da kommt er mit -1 zurück weil kein Bild da ist. Er legt es dann aber nicht an. Sind die DemoSource andere als die exe-files??

Edit2:
Der fehler ist hier.
Delphi-Quellcode:
// ------------------------------------------
// set pictures
// ------------------------------------------
procedure TID3v2Tag.SetPicture(MimeTyp: AnsiString; PicType: Byte; Description: UnicodeString; stream: TStream);
var IDX: Integer;
    NewFrame: TID3v2Frame;
    idStr: AnsiString;
    oldMime: AnsiString;
    oldDescription: UnicodeString;
    oldType: Byte;
    oldStream: TMemoryStream;
begin
    idStr := GetFrameIDString(IDv2_PICTURE);
    IDX := GetPictureFrameIndex({PicType,} Description);
    if IDX <> -1 then
    begin
        if Stream = NIL then
          Frames.Delete(IDX)
        else
        begin
            if (Description = '*') or (MimeTyp = '*') or (Stream.size = 0) then
            begin
                oldStream := TMemoryStream.Create;
                (Frames[IDX] as TID3v2Frame).GetPicture(oldMime, oldType, oldDescription, oldStream);
                if (Description = '*') then
                  Description := oldDescription;
                if (MimeTyp = '*') then
                  MimeTyp := oldMime;
                if Stream.Size = 0 then
                  oldStream.SaveToStream(Stream);
                oldStream.Free;
            end;
            (Frames[IDX] as TID3v2Frame).SetPicture(MimeTyp, PicType, Description, Stream)
        end;

    end else
    begin
        if (Stream <> NIL) and (Stream.Size > 0)then
        begin
            NewFrame := TID3v2Frame.Create(idStr, TID3v2FrameVersions(FVersion.Major));
            NewFrame.AlwaysWriteUnicode := fAlwaysWriteUnicode;
            newFrame.CharCode := fCharCode;
            NewFrame.AutoCorrectCodepage := fAutoCorrectCodepage;
            Frames.Add(newFrame);
            if (Description = '*') then
                Description := '';
            if (MimeTyp = '*') then
                  MimeTyp := 'image/jpeg';
            newFrame.SetPicture(MimeTyp, PicType, Description, stream)
        end;
    end;
end;
Er merkt das kein Bild da ist, legt es an (NewFrame) und "schmeisst" es weg. Trotzdem frage ich mich warum es bei den demo-exe-files geht. Dürfte ja nicht...

DelTurbo 30. Jun 2011 16:30

AW: Mp3FileUtils
 
Sorry, ich steh nun TOTAL aufm schlauch. Sobald er TID3v2Tag.SetPicture macht, speichert er garkeine infos. Kommentier ich diese eine zeile aus, nimmt er wenigtens die anderen einträge.

Nun bin ich total verwirrt...

UPS... Sorry für den "spam". Ich wollte eigentlich editieren..

Gausi 30. Jun 2011 19:27

AW: Mp3FileUtils
 
Kann sein, dass da in der 0.5er Version ein Bug drin ist. Ich hab es grade mit der aktuellen Version 0.6 ausprobiert, und da funktioniert das. Auch wenn bisher kein Bild in dem mp3 drin ist. Ich änder die Links im ersten Posting mal, das hatte ich hier vergessen. ;-)

Um ein Bild erweitert wird da aber nichts. In der "Level2-Demo" wird "irgendein" Bild geschrieben, d.h. ein vorhandenen wird überschrieben.

DelTurbo 1. Jul 2011 09:02

AW: Mp3FileUtils
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
erstmal vielen dank für deine antwort. Aber ich habe es mit der 06er probiert. Die habe ich von deiner Homepage geladen.

Das mit dem NewFrame (oben der Codesnipsel) verstehe ich leider garnicht. Muss das nicht auch wieder freigeben werden? Dort läuft er ja durch wenn kein Bild vorhanden ist.

Auch verstehe ist nicht warum deine demo exe 170kb grösser ist, als die exe die ich mit deiner demo erstelle. Zumal es wirklich mit DEINER exe funktioniert. Das heisst wenn kein Bild enthalten war, wird das bild reingemacht und auch danach z.b. im Mediaplayer angezeigt.

Erstelle ich die, geht es wirklich nur wenn schon ein bild vorhanden war. Ich hänge dir die exe mal hier dran.

Vielen dank für deine hilfe!!!

Gausi 1. Jul 2011 09:16

AW: Mp3FileUtils
 
Der NewFrame wird später automatisch freigegeben, wenn das TID3v2Tag-Objekt selbst freigegeben wird. Das ist halt ein neuer Block von Information, der im Tag enthalten ist und von diesem auch verwaltet wird.

Wenn es mit meiner Exe klappt, aber mit deinem Compilat der Original-Demo nicht, dann habe ich einen schlimmen Verdacht, falls du wirklich Delphi 7 verwendest, wie im Profil angegeben. Da muss ich wohl am WE mein D7 Personal nochmal installieren und ausprobieren. Könnte sein, dass da noch ein String-AnsiString-Problem besteht :oops:. Die Demo habe ich nämlich mit D2009 compiliert.

DelTurbo 1. Jul 2011 09:27

AW: Mp3FileUtils
 
Jap, ich habe es grade probiert. Unter 2009 geht es wirklich. Unter D7 nicht. Unter 2009 ist auch die .exe so gross wie deine. Unter 2009 tritt beim laden eines mp3 OHNE bild folgender fehler auf. Aber nehme ich dann ein Bild rein und speichere es ab, dann ist es wirklich da. :thumb:

"Im Projekt Demo_ID3v2_Level2.exe ist eine Exception der Klasse EJPEG mit der Meldung 'JPEG-Fehler #42' aufgetreten."

Wär echt super wenn man das fixen könnte damit man/ich es auf D7 nutzen könnte. Vielleicht kannst du mir ja sagen wo ich ungefähr suchen muss. Sollte ich das finden, werde ich dir das natürlich zukommen lassen.

Nochmals danke für die Hilfe!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:34 Uhr.
Seite 1 von 3  1 23      

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