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
Suche DLL oder Libary für ID3 Tags
Suche DLL oder Libary für ID3 Tags
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
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...
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...
@Sunny
Würde es mir ja selber machen, nur ich bin blutiger PureBasic anfänger, und das traue ich mir noch nicht zu
@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
Würde es mir ja selber machen, nur ich bin blutiger PureBasic anfänger, und das traue ich mir noch nicht zu

@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
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
Hi,
hab hier gerade was gefunden ist nen Code von NicTheQuick aus dem alten Board:
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
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
Ps: ich such noch nen platform unabhängigen code für Vorbiscomments hat wer sowas?
mfg
125
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
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