Seite 1 von 1

Suche DLL oder Libary für ID3 Tags

Verfasst: 19.09.2004 11:44
von Lukaso
Hallo,

ich suche eine DLL oder ne Libary für ID3 Tags und oder auch für OGG Tags, ich benutze eigentlich den Schnippsel aus dem CodeArchiv, nur der ist ein bißchen Anfällig.

Danke für Eure Hilfe

Lukaso

Verfasst: 20.09.2004 01:41
von Ynnus
Ich kann dir zwar nicht mit einer DLL oder Lib dienen, aber vielleicht tut es auch der Ratschlag, doch einfach selbst eine Procedure für das Einlesen der ID3 Tags zu schreiben.
Die Infos wie sie im ID3 Tag stehen, befinden sich alle im Header einer MP3 Datei. Also musst du eigentlich nur eine MP3 Datei mit Readfile öffnen und an der gewünschten Stelle den Wert einlesen.
Infos zum Header von MP3s bekommst du hier: http://www.wotsit.org/
Oder such ein wenig bei Google, da steht sicher auch beschrieben, bei welchen Bytes sich die Infos zum ID3 Tag befinden...

Verfasst: 20.09.2004 01:51
von redacid
Welche Version der Tags willst du benutzen/auslesen/schreiben? Welchen Beispielcode von PureArea hast du getestet und was war daran anfällig?

Verfasst: 21.09.2004 16:20
von Lukaso
@Sunny
Würde es mir ja selber machen, nur ich bin blutiger PureBasic anfänger, und das traue ich mir noch nicht zu :wink:

@redacid
Ich möchte ID3v1, ID3v2 und OGG-Tags lesen. Ich habe volgenden Source benutzt: http://www.purearea.net/pb/CodeArchiv/M ... gReader.pb


Habe es schon mit FMOD versucht auszulesen, nur bekomme ich das nicht hin. :|

MFG Lukaso

Verfasst: 27.12.2004 19:36
von 125
Hi,
hab hier gerade was gefunden ist nen Code von NicTheQuick aus dem alten Board:

Code: Alles auswählen

Structure MP3Info 
  FileSize.l 
  MilliSecs.l 
  Bitrate.l     ; wenn negativ, dann variable Bitrate (negierter Durchschnitt) 
  Frequency.l 
  nFrames.l     ; MPEG-Frames 
EndStructure 

Structure MP3 
  Info.MP3Info 
  ID3v1_Track.l 
  ID3v1_Title.s 
  ID3v1_Artist.s 
  ID3v1_Album.s 
  ID3v1_Year.l 
  ID3v1_Genre.l 
  ID3v1_Comment.s 
  
  ID3v2_Track.l 
  ID3v2_Title.s 
  ID3v2_Artist.s 
  ID3v2_Album.s 
  ID3v2_Year.l 
  ID3v2_Genre.s 
  ID3v2_Comment.s 
  ID3v2_Composer.s 
  ID3v2_OrigArtist.s 
  ID3v2_Copyright.s 
  ID3v2_URL.s 
  ID3v2_EncodedBy.s 
  ID3v2_Encoder.s 
  ID3v2_PlayCounter.s 
  ID3v2_Language.s 
  ID3v2_Length.s 
  ID3v2_Mediatyp.s 
  ID3v2_Publisher.s 
EndStructure 

Dim Genre.s(147) 

Procedure InitGenre() 
  Protected a.l 
  Restore Genre 
  For a = 0 To 146 
    Read Genre(a) 
  Next 
  
  DataSection 
    Genre: 
    Data.s "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal" 
    Data.s "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial" 
    Data.s "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk" 
    Data.s "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise" 
    Data.s "AlternRock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic" 
    Data.s "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta" 
    Data.s "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", "New Wave", "Psychadelic", "Rave", "Showtunes" 
    Data.s "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock" 
    Data.s "Folk", "Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass" 
    Data.s "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", "Acoustic" 
    Data.s "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove" 
    Data.s "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle" 
    Data.s "Duet", "Punk Rock", "Drum Solo", "Acapella", "Euro-House", "Dance Hall", "Goa", "Drum & Bass", "Club-House", "Hardcore", "Terror", "indie", "Brit Pop", "Negerpunk" 
    Data.s "Polsk Punk", "Beat", "Christian Gangsta Rap", "Heavy Metal", "Black Metal", "Crossover", "Comteporary Christian" 
    Data.s "Christian Rock", "Merengue", "Salsa", "Trash Metal", "Anime", "JPop", "Synth Pop" 
  EndDataSection 
EndProcedure 

Procedure.s ReadStringL(Length.l) ;Read the string with the given length from the current file 
  Protected String.s 
  String = Space(Length) 
  ReadData(@String, Length) 
  ProcedureReturn String 
EndProcedure 

#MP3File_ID = 0 
Procedure GetMP3Information(File.s, *MP3Information.MP3) 
  Protected ID3Size.l, Byte.l, Size.l, FrameSize.l, Version.l 
  
  If ReadFile(#MP3File_ID, File) 
    GetMP3Info(File, @*MP3Information\Info) 
    
    FileSeek(Lof() - 128)     ;ID3v1-Tag 
    If ReadStringL(3) = "TAG" 
      *MP3Information\ID3v1_Title = ReadStringL(30) 
      *MP3Information\ID3v1_Artist = ReadStringL(30) 
      *MP3Information\ID3v1_Album = ReadStringL(30) 
      *MP3Information\ID3v1_Year = Val(ReadStringL(4)) 
      *MP3Information\ID3v1_Comment = ReadStringL(29) 
      *MP3Information\ID3v1_Track = ReadByte() & $FF 
      *MP3Information\ID3v1_Genre = ReadByte() & $FF 
    EndIf 
    
    FileSeek(0)               ;ID3v2-Tag 
    If ReadStringL(3) = "ID3" 
      Version = ReadByte() 
      If Version = 2 Or Version = 3 Or Version = 4 
        
        ReadWord() 
        ID3Size = 0 
        For Byte = 3 To 0 Step -1 
          ID3Size + (ReadByte() << (7 * Byte)) 
        Next 
        
        Size = 0 
        Repeat 
          ; get frames until no more 
          FrameID.s = ReadStringL(4) 
          If PeekB(@FrameID) = 0 
            Break 
          EndIf 
          
          ; get frame size 
          FrameSize = 0 
          For Byte = 3 To 0 Step -1 
            FrameSize + (ReadByte() << (7 * Byte)) 
          Next 
          
          ; add frame size to total size 
          Size + FrameSize 
          
          ; skip flag and language bytes 
          ReadWord() 
          ReadByte() 
          
          ; get frame contents 
          ; subtract one for language byte 
          FrameSize - 1 
          ;Contents.s = ReadStringL(FrameSize) 
          
          ; put frame contents into structure 
          Select FrameID 
            Case "TALB" 
              *MP3Information\ID3v2_Album = ReadStringL(FrameSize) 
            Case "TCOM" 
              *MP3Information\ID3v2_Composer = ReadStringL(FrameSize) 
            Case "TCON" 
              *MP3Information\ID3v2_Genre = ReadStringL(FrameSize) 
            Case "TCOP" 
              *MP3Information\ID3v2_Copyright = ReadStringL(FrameSize) 
            Case "TENC" 
              *MP3Information\ID3v2_EncodedBy = ReadStringL(FrameSize) 
            Case "TIT2" 
              *MP3Information\ID3v2_Title = ReadStringL(FrameSize) 
            Case "TOPE" 
              *MP3Information\ID3v2_OrigArtist = ReadStringL(FrameSize) 
            Case "TPE1" 
              *MP3Information\ID3v2_Artist = ReadStringL(FrameSize) 
            Case "TRCK" 
              *MP3Information\ID3v2_Track = Val(ReadStringL(FrameSize)) 
            Case "TSSE" 
              *MP3Information\ID3v2_Encoder = ReadStringL(FrameSize) 
            Case "TYER" 
              *MP3Information\ID3v2_Year = Val(ReadStringL(FrameSize)) 
            Case "COMM"   ;Macht Winamp Fehler? Führende Sprachmarkierung: "eng" + Chr(0)... 
              ReadLong() 
              *MP3Information\ID3v2_Comment = ReadStringL(FrameSize - 4) 
            Case "WXXX"   ;Macht Winamp Fehler? Führendes Chr(0)... 
              ReadByte() 
              *MP3Information\ID3v2_URL = ReadStringL(FrameSize - 1) 
            Case "TPUB" 
              *MP3Information\ID3v2_Publisher = ReadStringL(FrameSize) 
            Case "TMED" 
              *MP3Information\ID3v2_Mediatyp = ReadStringL(FrameSize) 
            Case "TLEN" 
              *MP3Information\ID3v2_Length = ReadStringL(FrameSize) 
            Case "TLAN" 
              *MP3Information\ID3v2_Language = ReadStringL(FrameSize) 
            Case "PCNT" 
              *MP3Information\ID3v2_PlayCounter = ReadStringL(FrameSize) 
          EndSelect 
        Until Size >= ID3Size 
      EndIf 
    EndIf 
    ProcedureReturn #True 
  Else 
    ProcedureReturn #False 
  EndIf 
EndProcedure 

MP3File.s = OpenFileRequester("Chose a MP3-File...", "", "MP3-Dateien (*.mp3)|*.mp3|Alle Dateien (*.*)|*.*", 0) 
If MP3File 
  InitGenre() 
  
  Info.MP3 
  If OpenWindow(0, 0, 0, 320, 400, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "MP3-Information") 
    If CreateGadgetList(WindowID()) 
      TreeGadget(0, 0, 0, 320, 400, #PB_Tree_AlwaysShowSelection) 
      If GetMP3Information(MP3File, @Info) 
        AddGadgetItem(0, -1, "Infos about File: " + MP3File) 
        OpenTreeGadgetNode(0) 
          AddGadgetItem(0, -1, "Format") 
          OpenTreeGadgetNode(0) 
            AddGadgetItem(0, -1, "FileSize: " + Str(Info\Info\FileSize)) 
            AddGadgetItem(0, -1, "Length: " + Str(Info\Info\MilliSecs) + " ms (" + Str(Info\Info\MilliSecs / 60000) + ":" + Str(Info\Info\MilliSecs / 1000) + ")") 
            If Info\Info\Bitrate >= 0 
              AddGadgetItem(0, -1, "Bitrate: " + Str(Info\Info\Bitrate) + " bps") 
            Else 
              AddGadgetItem(0, -1, "Bitrate: variable (Average Bitrate: " + Str(-Info\Info\Bitrate) + " bps)") 
            EndIf 
            AddGadgetItem(0, -1, "Frequency: " + Str(Info\Info\Frequency) + " Hz") 
            AddGadgetItem(0, -1, "MPEG Frames: " + Str(Info\Info\nFrames)) 
          CloseTreeGadgetNode(0) 
          
          AddGadgetItem(0, -1, "ID3v1-Tag") 
          OpenTreeGadgetNode(0) 
            AddGadgetItem(0, -1, "Track: " + Str(Info\ID3v1_Track)) 
            AddGadgetItem(0, -1, "Title: " + Info\ID3v1_Title) 
            AddGadgetItem(0, -1, "Artist: " + Info\ID3v1_Artist) 
            AddGadgetItem(0, -1, "Album: " + Info\ID3v1_Album) 
            AddGadgetItem(0, -1, "Year: " + Str(Info\ID3v1_Year)) 
            AddGadgetItem(0, -1, "Genre: " + Genre(Info\ID3v1_Genre)) 
            AddGadgetItem(0, -1, "Comment: " + Info\ID3v1_Comment) 
          CloseTreeGadgetNode(0) 
          
          AddGadgetItem(0, -1, "ID3v2_Tag") 
          OpenTreeGadgetNode(0) 
            AddGadgetItem(0, -1, "Track: " + Str(Info\ID3v2_Track)) 
            AddGadgetItem(0, -1, "Title: " + Info\ID3v2_Title) 
            AddGadgetItem(0, -1, "Artist: " + Info\ID3v2_Artist) 
            AddGadgetItem(0, -1, "Album: " + Info\ID3v2_Album) 
            AddGadgetItem(0, -1, "Year: " + Str(Info\ID3v2_Year)) 
            AddGadgetItem(0, -1, "Genre: " + Info\ID3v2_Genre) 
            AddGadgetItem(0, -1, "Comment: " + Info\ID3v2_Comment) 
            AddGadgetItem(0, -1, "Composer: " + Info\ID3v2_Composer) 
            AddGadgetItem(0, -1, "Original Artist: " + Info\ID3v2_OrigArtist) 
            AddGadgetItem(0, -1, "Copyright: " + Info\ID3v2_Copyright) 
            AddGadgetItem(0, -1, "URL: " + Info\ID3v2_URL) 
            AddGadgetItem(0, -1, "Encoded by: " + Info\ID3v2_EncodedBy) 
            AddGadgetItem(0, -1, "Encoder: " + Info\ID3v2_Encoder) 
            AddGadgetItem(0, -1, "Play Counter: " + Info\ID3v2_PlayCounter) 
            AddGadgetItem(0, -1, "Language: " + Info\ID3v2_Language) 
            AddGadgetItem(0, -1, "Length: " + Info\ID3v2_Length) 
            AddGadgetItem(0, -1, "Mediatyp: " + Info\ID3v2_Mediatyp) 
            AddGadgetItem(0, -1, "Publisher: " + Info\ID3v2_Publisher) 
          CloseTreeGadgetNode(0) 
        CloseTreeGadgetNode(0) 
      Else 
        AddGadgetItem(0, -1, "Wrong file type!") 
      EndIf 
      Repeat : Until WaitWindowEvent() = #PB_EventCloseWindow 
    EndIf 
  EndIf 
EndIf
benötigt diese userlib von El_choni: http://www.purearea.net/pb/download/use ... 3-info.zip
Ps: ich such noch nen platform unabhängigen code für Vorbiscomments hat wer sowas?


mfg
125

Verfasst: 18.03.2005 12:06
von BitchBird
hallo!

ich habe mich an einer eigenen proc versucht, aber alle byte angaben die ich im netz fand sind bei mir nicht zutreffend oder es reicht in meinem kopf nicht aus das umzusetzen.

es sind ID3v1 tags. z.b. der title, ab byte 4, beginnt bei mir bei byte 21. und das zieht sich mit allen sachen so hin. woran kann das liegen?

p.s.: war doch mein kopf, läuft nun. aber kann mir jemand folgenden befehl aus dem beispiel erklären: *MP3Information\ID3v1_Track = ReadByte() & $FF vor allem den teil mit & $FF