Announcement

Collapse
No announcement yet.

Wie schreibt man einen ID3-Tag?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie schreibt man einen ID3-Tag?

    Hi,

    wenn ich mit folgendem Code versuche den Tag eines MP3-Stückes zu setzen,
    dann habe ich Sonderzeichen mit im String (#07 oder #12).
    Was ist denn daran Falsch?

    Code:

    procedure setID3Tag (FileName: string ; ID_Tag: TID3Tag) ;
    var
    FS: TFileStream ;
    begin
    FS := TFileStream.Create (FileName, fmOpenReadWrite or fmShareDenyWrite) ;
    try
    with ID_Tag, FS do
    begin
    Seek (-128, soFromEnd) ;
    WriteBuffer (ID, 3) ;
    WriteBuffer (Titel, 30) ;
    WriteBuffer (Artist, 30) ;
    WriteBuffer (Album, 30) ;
    WriteBuffer (Year, 4) ;
    WriteBuffer (Comment, 30) ;
    WriteBuffer (Genre,1) ;
    end ;
    finally
    FS.Free ;
    end ;
    end ;

    Der Aufruf erfolgt so:

    {aus Form2 werden einzelne Edit-Felder zugewiesen, vorher ein Record (siehe
    ganz unten) als Variable immer komplett auf #0 gesetzt)

    with Form2, Dummy_ID3 do
    begin
    FillChar (ID, 3, #0) ;
    ID := Edit_ID.Text ;
    FillChar (Titel, 30, #0) ;
    Titel := Edit_Titel.Text ;
    FillChar (Artist, 30, #0) ;
    Artist := Edit_Artist.Text ;
    FillChar (Album, 30, #0) ;
    Album := Edit_Album.Text ;
    FillChar (Year, 4, #0) ;
    Year := Edit_Jahr.Text ;
    FillChar (Comment, 30, #0) ;
    Comment := Edit_Kommentar.Text ;
    Genre := ComboBox_Genre.ItemIndex ;
    end ;
    if Form2.Tag = 0 then
    setID3Tag (ListBox1.Items[MenuItem_Eintrag_enfernen.Tag], Dummy_ID3)

    Hier der Record:

    type
    TID3Tag = record
    ID: string[3] ;
    Titel: string[30] ;
    Artist: string[30] ;
    Album: string[30] ;
    Year: string[4] ;
    Comment: string[30] ;
    Genre: Byte ;
    end ;

    So, wenn also nix drin steht in einem Edit-Feld, ist es ja egal, denn der
    jeweilige Teil vom Record ist ja mit #0 gefüllt - je nach Grösse. Aber woher
    kommen denn dann die Sonderzeichen (siehe Procedure weiter oben)?
    Die Deklaration ist einfach das Gegenteil der Ausleseprocedure. Diese findet
    man ja in dieser oder anderer Form genug im WWW.

    Hat jemand eine Idee?

    Außerdem eins noch, ID wird IMMER nur mit 2 Werten zugeteilt, der nächste
    Teil von FS.Write - der Teil hier:
    WriteBuffer (Titel, 30) ;
    Überschreibt immer das letzte Byte vom vorigen ID in der Datei mit einem
    Sonderzeichen (#07).
    So wird aus ID='123' eben ein '12|' |=Platzhalter für #07.

    Warum?

    Einen Download findet man unter
    www.nogad.de/nogad/index.php?TRM=work&work=PLAYER
    Source und Binary.

    Wer eine Antwort hat, für Delphi 5, den bitte ich um Hilfe

    Gruß Mathias

    .. ——————————————————————————————————————
    .. Home: nogad.de
    .. Mail: [email protected]
    .. Werbung:Pension-Fiege.de
    .. ——————————————————————————————————————
    .. Hier gibts was zum SPAREN
    .. www.sparen-will-ich.de
    .. Vieles auch für Computer dabei
    .. ——————————————————————————————————————

  • #2
    Hallo, <br><br>

    versuch's mal mit der Komponente hier. Funktioniert einwandfrei.<br>
    http://www.torry.net/vcl/mmedia/audio/id3v2.zip<br>
    <br>
    Gruss<br>
    stalle<br&gt

    Comment


    • #3
      hi,

      ein Fehler den du da machst ist ganz klar. Dein Record bestehet aus sog. Pascal-Strings, d.h. STRING[0] entspricht der Länge des Strings. Durch WriteBuffer schreibst du also die Länge mit weg, dafür fällt das letzte Zeichen unter den Tisch.

      Deshalb:

      Arbeite mit einfachen 0-basierten Arrays. Die Übertragung der Edits müßte dann so aussehen.

      move(edit1.text[1],Titel[0],length(edit1.text));

      Weiterer Tip:

      Statt vieler einzelner WriteBuffer solltest du dir im Speicher einen kompletten Buffer halten (array[0..127] of Char) diesen manipulieren und mit einem WriteBuffer wegschreiben. Das geht schneller, insbesondere beim Massen-Taggen:

      Comment

      Working...
      X