![]() |
Mp3FileUtils.pas Zugriffsverletzung beim schreiben von Tags.
Halli hallo liebe Leute,
ich habe mir die Mp3FileUtils.pas von Gausi hier aus dem Forum geladen und damit versucht einen ID3Tag in eine Datei zu schreiben, mit folgendem Code ...
Code:
Diesen Code habe ich aus der beiligenden Manual und hab ihn für meine Bedürfnisse angepasst ..., leider erfolgt bei der Ausführung ne Fehlermeldung : Zugriffsverletzung .....
stream := TFileStream.Create(Datei,fmOpenRead or fmShareDenyWrite);
// ID3-Tag auslesen Id3v2Tag.ReadFromStream(stream); // an das Ende des Tags springen if Not Id3v2Tag.exists then stream.Seek(0, sobeginning) else stream.Seek(Id3v2Tag.size, soFromBeginning); Id3v2Tag.Artist := Interpret; Id3v2Tag.Title := Titel; Id3v2Tag.Genre := Genre; Id3v2Tag.Year := Jahr; Id3v2Tag.Comment:= datetostr(datum)+' / '+timetostr(datum); Id3v2Tag.WriteToStream(Stream); stream.free; Kann mir da jemand weiterhelfen? Ich danke euch im vorraus für die Hilfe und Tipps. Liebe Grüße, Patrick. |
AW: Mp3FileUtils.pas Zugriffsverletzung beim schreiben von Tags.
Wo wird die Klasse erzeugt Id3v2Tag?
|
AW: Mp3FileUtils.pas Zugriffsverletzung beim schreiben von Tags.
Hallo und vielen Dank für deine Antwort ...
diesen Teil hatte ich in der tat noch vergessen ... danke für den Denkanstoß!!! Leider komme ich nun zu einem "Stream-Schreibfehler" ...
Code:
stream := TFileStream.Create(Datei,fmOpenRead or fmShareDenyWrite);
// ID3-Tag auslesen Id3v2Tag := TId3v2Tag.Create; Id3v2Tag.ReadFromStream(stream); // an das Ende des Tags springen if Not Id3v2Tag.exists then stream.Seek(0, sobeginning) else stream.Seek(Id3v2Tag.size, soFromBeginning); Id3v2Tag.Artist := Interpret; Id3v2Tag.Title := Titel; Id3v2Tag.Genre := Genre; Id3v2Tag.Year := Jahr; Id3v2Tag.Comment:= datetostr(datum)+' / '+timetostr(datum); Id3v2Tag.WriteToStream(Stream); stream.free; Id3v2Tag.Free; |
AW: Mp3FileUtils.pas Zugriffsverletzung beim schreiben von Tags.
Zitat:
ABER: Der Code ist Murks! Ich hoffe mal nicht, dass das so in den Demos drinsteht! :pale: (vermutlich nicht, schließlich wird der Stream nur zum lesen geöffnet. :) ) Id3v2Tag.WriteToStream(Stream); sollte eigentlich NIE direkt verwendet werden. Denn dadurch wird nur der Tag in den Stream geschrieben. Einfach so. Dabei wird weder der bereits vorhandene Tag sauber entfernt, noch wird getestet, ob das neue Tag-Objekt da überhaupt reinpasst. Dadurch werden dann ggf. Audiodaten überschrieben, oder die Datei wird generell ungültig! Zum Schreiben IMMER WriteToFile(dateiname) benutzen. Die Methode ist trotzdem public, weil man sie z.B. nutzen kann, wenn man eine neue Mp3-Datei erstellen will, z.B. bei Webradio-Aufnahme und dort am Anfang einen TId3v2-Tag erstellen möchte. Edit: Also Den Stream rausschmeißen und stattdessen mit dem FileName arbeiten. |
AW: Mp3FileUtils.pas Zugriffsverletzung beim schreiben von Tags.
Danke Gausi,
Ich habe das jetzt mal angepasst und nehme nun Id3v2Tag.WriteToFile(Datei); zum schreiben des Tags, das klappt auch soweit, allerdings ... wird der Wert aus Id3v2Tag.comment nicht mit gespeichert....?? |
AW: Mp3FileUtils.pas Zugriffsverletzung beim schreiben von Tags.
Der sollte eigentlich auch übernommen werden. Problem könnte höchstens sein, dass in dem Tag mehrere Comment-Frames enthalten sind (das ist erlaubt), und beim Schreiben des "Standard-Kommentars", der bei der Comment-Property benutzt wird, ein anderer Frame verwendet wird als beim lesen. Das wäre dann ein blöder Bug, der mir bisher nicht aufgefallen ist.
Schick mir die Datei, bei der das nicht funktioniert, ggf. mal per Mail. Dann schau ich mir die mal an. ;-) |
AW: Mp3FileUtils.pas Zugriffsverletzung beim schreiben von Tags.
Bin schon dabei ... die Mail geht an die Impressum Adresse deiner Homepage, dauert aber nen kleinen Moment .... ist natürlich gleich ein 15MB track :( sollte es der fall sein das da mehrere solcher Comments drin sind, kann man die nicht pauschal entfernen lassen bevor man neue reinschreibt, wenn ja -> wie?
|
AW: Mp3FileUtils.pas Zugriffsverletzung beim schreiben von Tags.
Danke für die Mail, auch wenn diese Art von Musik wahrscheinlich nicht lange auf meiner Platte überleben wird. ;-)
Der Tag in der Datei ist etwas merkwürdig. Tatsächlich tauchen dort zwei Kommentar-Frames auf, die aber beide "09.05.2011 / 09:55:51" lauten. Der eine ist ANSI-kodiert, der andere UTF16. Wenn ich den Kommentar über meine Demo-Anwendungen ändere, dann klappt das, soll heißen der erste Frame wird geändert und auch wieder gelesen. Warum die Info "Jahr" (2011) allerdings 5 mal darin auftaucht, ist mir absolut schleierhaft. Hats du denn auch das Lesen auf ReadFromFile umgestellt? Oder anders gefragt: Werden andere Daten (Interpret, ...) übernommen? Zum löschen aller Kommentare sollte dieser Code funktionieren:
Delphi-Quellcode:
Bei der Zuweisung des Leerstrings wird der Comment-Frame gelöscht. Wenn ein weiterer im Tag enthalten ist, wird dieser als "Comment" gefunden.
while Id3v2tag.Comment <> '' do
Id3v2tag.Comment := ''; |
AW: Mp3FileUtils.pas Zugriffsverletzung beim schreiben von Tags.
Danke für deine Mühe, inzwischen habe ich festgestellt, das es tatsächlich in die Datei geschrieben wird, aber ... wähle ich die Datei im Explorer aus, gehe auf Eigenschaften, dann auf Details steht unter "Beschreibungen -> Kommentare" nichts drin???
|
AW: Mp3FileUtils.pas Zugriffsverletzung beim schreiben von Tags.
Ok, das wäre dann ein weiterer Punkt, den ich an der Microsoft'schen Behandlung von ID3Tags hasse. Nicht nur, dass der 9 Jahre alte ID3v2.4-Tag auch in Windows 7 immer noch nicht erkannt wird, und beim Schreiben einfach ein ID3v2.3-Tag davor geknallt wird (oder der WMP einfach ne Exception schmeißt). Ne, jetzt beschränkt sich die Kommentar-Anzeige auch auf deutsche Kommentare. :wall:
Zur Erklärung: Kommentarfelder enthalten nicht nur den Kommentar an sich, sondern auch die Sprache des Kommentars (und ggf. auch eine Beschreibung des Kommentars). In der Datei, die du mir geschickt hast, ist die Sprache "eng", also englisch, wie in den meisten anderen Files vermutlich auch. Ändert man die mit einem Hex-Editor auf "deu", dann wird der Kommentar im Explorer angezeigt. Ändert man dann den Kommentar mit "ID3v2tag.Comments = ...", dann wird auch die Änderung im Explorer angezeigt, da die Sprache von Mp3FileUtils nicht verändert wird und demnach auf "deu" gelassen wird, damit das liebe Windows das auch versteht. Was dieser Unfug soll, weiß ich allerdings nicht so ganz. Es ist zwar schön, dass auf einem deutschen Windows ein deutscher Kommentar bevorzugt wird, aber dass es dann keinen Fallback auf andere Sprachen gibt, finde ich sehr merkwürdig. :? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 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 by Thomas Breitkreuz