|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
FatalError
Anmeldungsdatum: 22.11.2004 Beiträge: 21 Wohnort: Berga/Elster
|
Verfasst am: 03.12.2004, 23:53 Titel: ID3 Tags auslesen? |
|
|
Hi Leute
Hat zufällig jemand eine Ahnung, wie man aus MP3-Dateien den ID3-Tag auslesen kann?
Sicher muss man die binär einlesen, nur wie finde ich die Titel-/Album-/Interpret-informationen?
MFG
FatalError |
|
Nach oben |
|
|
Paul aka ICC, HV-Freak
Anmeldungsdatum: 11.09.2004 Beiträge: 588 Wohnort: Uelzen
|
Verfasst am: 04.12.2004, 12:14 Titel: |
|
|
Also bei meinen MP3's die ich auf dem PC hab, stehen diese Informationen ganz am Anfang der Datei; Interpret, Album, Jahr der Veröffentlichung usw.
Man müsste mal versuchen, die Struktur der Daten herauszuarbeiten.
Vielleicht gibts im Netz irgendwo eine Art "Datenblatt" von MP3's _________________
|
|
Nach oben |
|
|
FatalError
Anmeldungsdatum: 22.11.2004 Beiträge: 21 Wohnort: Berga/Elster
|
Verfasst am: 04.12.2004, 12:34 Titel: |
|
|
Hab da nach nochmaligen googeln folgenden Tipp gefunden, geschrieben für VB.
http://www.activevb.de/tipps/vb6tipps/tipp0408.html
Nun habe ich von VB absolut keine Ahnung, kann mir vielleicht jemand sagen, was ich beim "übersetzen" zu beachten habe?
MFG
FatalError |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 04.12.2004, 13:58 Titel: VB>QB |
|
|
Hallo.
Lass Sachen wie Public weg. Weiterhin musst du beim TYPE eine Stringlänge angeben und TRUE und FALSE vorher als Konstanten festlegen.
Und natürlich musst du alle Steuerelementsachen raustun.
Wenn du nicht klarkommst, mach ich dir das Programm in VB. Dann kannst du es aus QB so aufrufen:
SHELL "ID3TAG.EXE MeinMp3.mp3, Infos.txt" und dann mit OPEN die Infos aus der Textdatei auslesen.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
FatalError
Anmeldungsdatum: 22.11.2004 Beiträge: 21 Wohnort: Berga/Elster
|
Verfasst am: 04.12.2004, 15:15 Titel: |
|
|
Währe eine gute Idee, dass du mir das linkst, nur würde das auch unter MS-DOS laufen? Soweit ich weiß tut es das nicht, also werde ich wohl versuchen müssen das zu übersetzen...
Mir bereitet nur der Teil hier Kopfschmerzen:
Open MP3FileName For Binary As Mp3FileNumber
Mp3FileContent = String$(LOF(Mp3FileNumber), "!")
Get Mp3FileNumber, , Mp3FileContent
Close Mp3FileNumber
Wie mach ich das in QB? |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 04.12.2004, 15:24 Titel: Also... |
|
|
Hallo.
Du hast ganz Recht. Unter DOS würde das nicht laufen.
Code: | Open MP3FileName For Binary As Mp3FileNumber
Mp3FileContent = String$(LOF(Mp3FileNumber), "!")
Get Mp3FileNumber, , Mp3FileContent
Close Mp3FileNumber |
wird schwierig, da der String Mp3FileContent das ganze MP3 Lied fassen müsste. In QB passen da aber maximal 32KB oder sowas rein.
In VB ist das halt kein Problem. Da kann der ganze RAM genutzt werden, aber in QB bekommst du niemals ein ganzes MP3 Lied in eine Stringvariable...
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
Paul aka ICC, HV-Freak
Anmeldungsdatum: 11.09.2004 Beiträge: 588 Wohnort: Uelzen
|
Verfasst am: 04.12.2004, 15:31 Titel: |
|
|
Naja es ist ja wohl übertrieben, die ganze File in einen Sting zu laden...uns interessiert ja nur der Header, dann nimmt man halt die ersten 1024 bytes der Datei oder so (Wo gibts schon nen Header > 1kB ?) _________________
|
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
FatalError
Anmeldungsdatum: 22.11.2004 Beiträge: 21 Wohnort: Berga/Elster
|
Verfasst am: 05.12.2004, 21:48 Titel: |
|
|
Alles klar, ich hab nun folgenden Codeschnipsel, mit dem ich die ersten 2kB der MP3 Datei einlesen kann.
Code: |
DIM info AS STRING * 2048
GET #1, 1, info
|
Wenn ich <info> in eine Textdatei ausgebe, dann kann ich immerhin schonmal den Interpret, Titel, Album und alles andre erkennen, nur wie lasse ich QB wissen, wo was steht? |
|
Nach oben |
|
|
FatalError
Anmeldungsdatum: 22.11.2004 Beiträge: 21 Wohnort: Berga/Elster
|
Verfasst am: 07.12.2004, 15:55 Titel: |
|
|
Okay, habs selbst versucht den Rest zu übersetzen, aber das will mir einfach nicht ganz gelingen...
Ich bekomme zB bei der Zeile
Code: | lngID3Length = &H200000 * ASC(te$) + &H4000 * ASC(MID$(ID3Length, 2, 1)) + &H80 * ASC(MID$(ID3Length, 3, 1)) + ASC(MID$(ID3Length, 4, 1)) |
Die Fehlermeldung "Unzulässiger Funktionsaufruf" und ich glaube das wird nicht der einzige bleiben...
Kann sich das mal bitte jemand anschaun, ich komm einfach nicht weiter!
Hier der Code:
Code: |
Dim Mp3FileNumber, Mp3FileContent As String
Dim ID3Position As Long, ID3Length As String, lngID3Length As Long
Dim ID3Version As String, ID3V2Tag As String
OPEN "TEST.mp3" FOR BINARY AS #1
GET #1, , Mp3FileContent
CLOSE
'ID3V2-Tag suchen
ID3Position = INSTR(Mp3FileContent, "ID3")
IF ID3Position = 0 THEN
GetID3TagV2 = False
'EXIT DEF '************ abändern für Funktion !
END IF
'Länge bestimmen
ID3Length = MID$(Mp3FileContent, ID3Position + 6, 4)
te$ = LEFT$(ID3Length, 1)
lngID3Length = &H200000 * ASC(te$) + &H4000 * ASC(MID$(ID3Length, 2, 1)) + &H80 * ASC(MID$(ID3Length, 3, 1)) + ASC(MID$(ID3Length, 4, 1))
ID3V2Tag = MID$(Mp3FileContent, ID3Position, lngID3Length + 10)
Mp3FileContent = ""
'Nach Extended Header suchen...
IF (ASC(MID$(ID3V2Tag, 6, 1)) AND 32) = 32 THEN
ID3Tag.ExtendedHeader = True
ID3V2Tag = MID$(ID3V2Tag, 10)
END IF
ID3V2Tag = MID$(ID3V2Tag, 11)
'Nun Frame für Frame abarbeiten...
DIM FrameName AS STRING, FrameLen AS STRING
DIM FrameFlags AS STRING, Frame AS STRING
DIM lngFrameLen AS LONG
DO
'ID3V2.3
IF ASC(LEFT$(ID3Version, 1)) = 3 OR ASC(LEFT$(ID3Version, 1)) = 4 THEN
'Frame-Header auslesen
FrameName = LEFT$(ID3V2Tag, 4)
'Wenn es sich um den Footer handelt, dann sind wir
'fertig!
IF LEFT$(FrameName, 3) = "3DI" THEN EXIT DO
FrameLen = MID$(ID3V2Tag, 5, 4)
lngFrameLen = 256 * 8 * 8 * ASC(LEFT$(FrameLen, 1)) + 256 * 8 * ASC(MID$(FrameLen, 2, 1)) + 256 * ASC(MID$(FrameLen, 3, 1)) + ASC(MID$(FrameLen, 4, 1))
FrameFlags = MID$(ID3V2Tag, 9, 2)
ID3V2Tag = MID$(ID3V2Tag, 11)
'Frame-Content bestimmen
SELECT CASE FrameName
CASE "TCON"
IF LEFT$(ID3V2Tag, 1) = CHR$(0) THEN
Genre$ = MID$(ID3V2Tag, 2, lngFrameLen - 1)
ELSE
Genre$ = LEFT$(ID3V2Tag, lngFrameLen)
END IF
CASE "TALB"
IF LEFT$(ID3V2Tag, 1) = CHR$(0) THEN
Album$ = MID$(ID3V2Tag, 2, lngFrameLen - 1)
ELSE
Album$ = LEFT$(ID3V2Tag, lngFrameLen)
END IF
CASE "TPE1"
IF LEFT$(ID3V2Tag, 1) = CHR$(0) THEN
Artist$ = MID$(ID3V2Tag, 2, lngFrameLen - 1)
ELSE
Artist$ = LEFT$(ID3V2Tag, lngFrameLen)
END IF
CASE "TIT2"
IF LEFT$(ID3V2Tag, 1) = CHR$(0) THEN
Title$ = MID$(ID3V2Tag, 2, lngFrameLen - 1)
ELSE
Title$ = LEFT$(ID3V2Tag, lngFrameLen)
END IF
END SELECT
ID3V2Tag = MID$(ID3V2Tag, lngFrameLen + 1)
'ID3V2.2
ELSEIF ASC(LEFT$(ID3Version, 1)) = 2 THEN
'Frame-Header auslesen
FrameName = LEFT$(ID3V2Tag, 3)
'Wenn es sich um den Footer handelt, dann sind wir
'fertig!
IF FrameName = "3DI" THEN EXIT DO
FrameLen = MID$(ID3V2Tag, 4, 3)
lngFrameLen = 256 * 8 * ASC(LEFT$(FrameLen, 1)) + 256 * ASC(MID$(FrameLen, 2, 1)) + ASC(MID$(FrameLen, 3, 1))
ID3V2Tag = MID$(ID3V2Tag, 7)
'Frame-Content bestimmen
SELECT CASE FrameName
CASE "TOA"
IF LEFT$(ID3V2Tag, 1) = CHR$(0) THEN
interpret$ = MID$(ID3V2Tag, 2, lngFrameLen - 1)
ELSE
interpret$ = LEFT$(ID3V2Tag, lngFrameLen)
END IF
CASE "TCO"
IF LEFT$(ID3V2Tag, 1) = CHR$(0) THEN
Genre$ = MID$(ID3V2Tag, 2, lngFrameLen - 1)
ELSE
Genre$ = LEFT$(ID3V2Tag, lngFrameLen)
END IF
CASE "TAL"
IF LEFT$(ID3V2Tag, 1) = CHR$(0) THEN
Album$ = MID$(ID3V2Tag, 2, lngFrameLen - 1)
ELSE
Album$ = LEFT$(ID3V2Tag, lngFrameLen)
END IF
CASE "TP1"
IF LEFT$(ID3V2Tag, 1) = CHR$(0) THEN
Artist$ = MID$(ID3V2Tag, 2, lngFrameLen - 1)
ELSE
Artist$ = LEFT$(ID3V2Tag, lngFrameLen)
END IF
CASE "TT2"
IF LEFT$(ID3V2Tag, 1) = CHR$(0) THEN
Title$ = MID$(ID3V2Tag, 2, lngFrameLen - 1)
ELSE
Title$ = LEFT$(ID3V2Tag, lngFrameLen)
END IF
END SELECT
ID3V2Tag = MID$(ID3V2Tag, lngFrameLen + 1)
END IF
LOOP UNTIL LEN(ID3V2Tag) = 0
PRINT interpret$
PRINT arist$
PRINT Title$
PRINT Album$
PRINT Genre$
|
|
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 07.12.2004, 17:49 Titel: Teil die Zeile mal auf |
|
|
Hallo.
Es kann sein, dass insbesondere QB45 mit so langen komplexen Zeilen Probleme hat. Ich hatte selbst schon einmal so ein Problem.
Beispiel:
Anstelle von
b%=9*555-7+999-6,5+123
lieber zweizeilig
b%=9*555-7
b%=b%+999-6,5+123
Bei einer solchen Rechnung ist das natürlich Quatsch, aber das was ich meine wird deutlich.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
FatalError
Anmeldungsdatum: 22.11.2004 Beiträge: 21 Wohnort: Berga/Elster
|
Verfasst am: 07.12.2004, 18:58 Titel: |
|
|
Habs so abgeändert:
Code: | lngID3Length = &H200000 * ASC(te$) + &H4000
lngID3Length = lngID3Length * ASC(MID$(ID3Length, 2, 1)) + &H80
lngID3Length = lngID3Length * ASC(MID$(ID3Length, 3, 1)) + ASC(MID$(ID3Length, 4, 1)) |
bringt aber trotzdem nicht das gewünschte Ergebnis, ich erhalte die selbe Fehlermeldung jetzt in der ersten Zeile. Auch mit dem QB7.1 Compiler sah es nicht besser aus... |
|
Nach oben |
|
|
Kai Bareis
Anmeldungsdatum: 10.09.2004 Beiträge: 545 Wohnort: Baden Würtemberg
|
Verfasst am: 07.12.2004, 19:39 Titel: |
|
|
Das problem ist das die ganze sache zu groß ist
te$=chr$(255) 'da man mit einem zeichen rechnen muss was so groß ist!
lngID3Length = &H200000 * ASC(te$) + &H4000
ergibt soch so was um die 500.000.000 ! (habe es als Double gedimt _________________ MfG Kai Bareis
Es ist noch kein Meister vom Himmel gefallen! Warum einfach wens auch umständlich geht! |
|
Nach oben |
|
|
DirtyHarry
Anmeldungsdatum: 21.11.2004 Beiträge: 23 Wohnort: Brachttal ca 40km von Hanau
|
Verfasst am: 11.12.2004, 18:38 Titel: |
|
|
Hallo,
Ich beschäftige mich zur Zeit auch damit, habe aber das Thema von der anderen Seite angefange. Ich habe mir erst mal den Aufbau des ID3-Tags angeschaut, wobei zu unterscheiden ist zwischen v1 und v2.
Der ID3-Tag v1 besteht aus nur einem einzigen 128 Byte großen Block, ist immer am Ende der MP3 und besteht aus 7 bzw. 8 Feldern mit einer festgelegten Länge. Er beginnt mit der Zeichenfolge: TAG
Der ID3-Tag v2 ist am Anfang der MP3. Die einzelnen Felder werden durch Schlüsselwörter eingeleitet. Er beginnt mit der Zeichenfolge: ID3
Der ID3-Tag v2.4 ist 10 Bytes vor dem Ende oder 10 Bytes vor dem Beginn des ID3-Tags v1. Er beginnt mit der Zeichenfolge: 3DI
Zusätzlich ist es noch möglich den ID3-Tag in den MPEG-Stream zu intregrieren.
http://www.id3.org/faq.html hat Folgendes geschrieben: |
Finally it is possible to embed ID3v2 tags in the actual MPEG stream, on an MPEG frame boundry. Almost nobody does this.
|
siehe auch
http://www.computerbase.de/lexikon/ID3-Tag
http://www.id3.org/ _________________ Gruß Andreas
---------
Aller Anfang ist schwer.
Meine Probleme(Ideen) möchte ich keinem anderen zumuten.
Kostenlose Operalizens bei mehr als 250 Klicks:
http://www.opera-for-dryhar.de.vu |
|
Nach oben |
|
|
DirtyHarry
Anmeldungsdatum: 21.11.2004 Beiträge: 23 Wohnort: Brachttal ca 40km von Hanau
|
Verfasst am: 11.12.2004, 19:26 Titel: |
|
|
Hier noch ein Auszug von http://www.computerbase.de/lexikon/ID3-Tag:
Format ID3v1
Es ist recht primitiv und besteht aus nur einem einzigen 128 Byte großen Block mit festem Aufbau:
Offset Länge Bedeutung
0 3 Kennung "TAG" zur Kennzeichnung eines ID3v1-Blocks
3 30 Songtitel
33 30 Künstler/Interpret
63 30 Album
93 4 Erscheinungjahr
97 30 Beliebiger Kommentar
127 1 Genre
Der Zeichensatz für die Textfelder ist nicht spezifiziert. Üblich sind ASCII, ISO-8859-1 und Unicode im UTF-8-Format.
Das Genre des Liedes wird als 1 Byte kodiert. Es existiert eine Liste, die angibt, welcher Wert welchem Genre entspricht.
Eine Weiterentwicklung ist ID3v1.1, welche das Kommentarfeld um ein Byte verkürzt und das Byte an Position 126 die Bedeutung "Liednummer" bekommt.
Format ID3v2
Die Zusatzinformationen werden in einem Block vor oder nach den Audio Daten (dem MPEG-Stream) in die Datei eingefügt. Den Beginn eines ID3-Blockes erkennt man anhand des Headers (Version ID3v2):
In der aktuellen Version (ID3v2.4) werden viele verschiedene Zusatzinformationen spezifiziert, hier nur mal die wichtigsten (sonst wird der Beitrag doppelt so lang):
4.11 COMM Comments
4.2.1 TALB Album/Movie/Show title
4.2.1 TCOM Composer
4.2.1 TCON Content type
4.2.1 TCOP Copyright message
4.2.1 TENC Encoded by
4.2.1 TIT2 Title/songname/content description
4.2.1 TOPE Original artist(s)/performer(s)
4.2.1 TPE1 Lead performer(s)/Soloist(s)
4.2.1 TRCK Track number/Position in set
4.2.1 TYER Year _________________ Gruß Andreas
---------
Aller Anfang ist schwer.
Meine Probleme(Ideen) möchte ich keinem anderen zumuten.
Kostenlose Operalizens bei mehr als 250 Klicks:
http://www.opera-for-dryhar.de.vu |
|
Nach oben |
|
|
DirtyHarry
Anmeldungsdatum: 21.11.2004 Beiträge: 23 Wohnort: Brachttal ca 40km von Hanau
|
|
Nach oben |
|
|
Stephan
Anmeldungsdatum: 05.10.2004 Beiträge: 358 Wohnort: Hessen - 20km Nördlich von Frankfurt am Main
|
Verfasst am: 11.12.2004, 22:16 Titel: |
|
|
Hier hast du eine Liste der Genres, die Zahlenkodierung steht davor
Code: |
1 Blues
2 Classic Rock
3 Country
4 Dance
5 Disco
6 Funk
7 Grunge
8 Hip-Hop
9 Jazz
10 Metal
11 New Age
12 Oldies
13 Other
14 Pop
15 R&B
16 Rap
17 Reggae
18 Rock
19 Techno
20 Industrial
21 Alternative
22 Ska
23 Death Metal
24 Pranks
25 Soundtrack
26 Euro-Techno
27 Ambient
28 Trip-Hop
29 Vocal
30 Jazz+Funk
31 Fusion
32 Trance
33 Classical
34 Instrumental
35 Acid
36 House
37 Game
38 Sound Clip
39 Gospel
40 Noise
41 AlternRock
42 Bass
43 Soul
44 Punk
45 Space
46 Meditative
47 Instrumental Pop
48 Instrumental Rock
49 Ethnic
50 Gothic
51 Darkwave
52 Techno-Industrial
53 Electronic
54 Pop-Folk
55 Eurodance
56 Dream
57 Southern Rock
58 Comedy
59 Cult
60 Gangsta
61 Top 40
62 Christian Rap
63 Pop/Funk
64 Jungle
65 Native American
66 Cabaret
67 New Wave
68 Psychadelic
69 Rave
70 Showtunes
71 Trailer
72 Lo-Fi
73 Tribal
74 Acid Punk
75 Acid Jazz
76 Polka
77 Retro
78 Musical
79 Rock & Roll
80 Hard Rock
81 Folk
82 Folk-Rock
83 National Folk
84 Swing
85 Fast Fusion
86 Bebob
87 Latin
88 Revival
89 Celtic
90 Bluegrass
91 Avantgarde
92 Gothic Rock
93 Progressive Rock
94 Psychedelic Rock
95 Symphonic Rock
96 Slow Rock
97 Big Band
98 Chorus
99 Easy Listening
100 Acoustic
101 Humour
102 Speech
103 Chanson
104 Opera
105 Chamber Music
106 Sonata
107 Symphony
108 Booty Bass
109 Primus
110 Porn Groove
111 Satire
112 Slow Jam
113 Club
114 Tango
115 Samba
116 Folklore
117 Ballad
118 Power Ballad
119 Rhythmic Soul
120 Freestyle
121 Duet
122 Punk Rock
123 Drum Solo
124 A capella
125 Euro-House
126 Dance Hall
127 Goa
128 Drum & Bass
129 Club-House
130 Hardcore
131 Terror
132 Indie
133 BritPop
134 Negerpunk
135 Polsk Punk
136 Beat
137 Christian Gangsta Rap
138 Heavy Metal
139 Black Metal
140 Crossover
141 Contemporary Christian
142 Christian Rock
143 Merengue
144 Salsa
145 Thrash Metal
146 Anime
147 JPop
148 Synthpop
|
_________________ 'Wir schätzen die Zeit erst, wenn uns nicht mehr viel davon geblieben ist.'
Leo Tolstoi |
|
Nach oben |
|
|
DirtyHarry
Anmeldungsdatum: 21.11.2004 Beiträge: 23 Wohnort: Brachttal ca 40km von Hanau
|
Verfasst am: 12.12.2004, 03:03 Titel: |
|
|
Zu beachten ist aber, alle Genre über 79 sind von Nullsoft hinzugefügt worden und somit kein Bestandteil des ID3v1 Standard.
Noch was zur Größe des ID3-Tags v2:
Die einzelnen Frames dürfen bis zu 16MB und der gesamte Tag bis zu 256MB groß sein.
Sogar Winamp ist bei solchen Tag-Größen etwas überfordert. _________________ Gruß Andreas
---------
Aller Anfang ist schwer.
Meine Probleme(Ideen) möchte ich keinem anderen zumuten.
Kostenlose Operalizens bei mehr als 250 Klicks:
http://www.opera-for-dryhar.de.vu |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|