ID3v2 aus mp3-Datei auslesen
Übersicht BlitzBasic Codearchiv
hecticSieger des IS Talentwettbewerb 2006Betreff: ID3v2 aus mp3-Datei auslesen |
So, März 05, 2006 11:51 Antworten mit Zitat |
|
---|---|---|
Hier eine Funktion mit welcher man Tag-Informationen aus mp3 (ID3V1 und ID3V2), ogg und Titelinformationen aus Moduldateien wie it, xm, mod, s3m und mtm -Dateien auslesen kann. Bei mp3-Dateien wird vorzugsweise ID3V2 ausgelesen, erst wenn hier nichts gefunden werden konnte, wird automatisch auf das ältere und wesentlich eingeschränkte ID3V1 ausgewichen. Bei ogg-Dateien sollte es keine Probleme geben. Lediglich werden Umlaute aus einer ogg-Datei unschön ausgegeben. Dazu fällt mir aber auch zur Zeit noch nichts ein.
Dieses hier ist ein Update vom 05.05.2009 welche zusätzlich Taginformationen aus ogg, mp3-ID3V1 und Titelinformationen aus Moduldateien auslesen kann. Anders als der Vorgänger schränke ich die Tags nun auf folgende Informationen ein: - Track - Title - Artist - Album - Year - Comment - Genre Weitere Informationen wie - Composer - Orginator - Copyright - URL - Encoder halte ich für überflüssig und werden auch von mp3-ID3V1 nicht unterstützt. Wer es aber dennoch braucht, kann sich um entsprechende Codeteile (weiter unten im Beitragsverlauf zu finden) erweitern. Sonstig weiter unten besprochene Probleme wie mit dem ISO-8859-1 als auch UTF-16 -Standard machen keine Probleme mehr. Code: [AUSKLAPPEN] Print "Tracknumber : "+GetIDTag("Data\Blau.mp3",0)
Print "Title : "+GetIDTag("Data\Blau.mp3",1) Print "Artist : "+GetIDTag("Data\Blau.mp3",2) Print "Album : "+GetIDTag("Data\Blau.mp3",3) Print "Date : "+GetIDTag("Data\Blau.mp3",4) Print "Comment : "+GetIDTag("Data\Blau.mp3",5) Print "Genre : "+GetIDTag("Data\Blau.mp3",6) WaitKey Function GetIDTag$(FFile$,FMode%=1) ;ALLGEMEINE/GÜLTIGKEITSPRÜFUNG If FileType(FFile)=1 Then ;VARIABLENDEKLARATIONEN Local IBuffering$="" Local ICollector$="" Local ITagStream$="" Local ICount%=0 Local IStart%=0 Local IFile%=0 Local ISize%=0 ;DATEIGRÖSSE/ENTNEHMEN ISize=FileSize(FFile) ;VERFÜGBARKEIT If ISize>1024 Then ;STRINGSTREAM/ERSTELLEN IFile=ReadFile(FFile) ;ERSTEN/KiB/ALS/STRING/ZUSAMMENSTELLEN SeekFile(IFile,0): For ICount=1 To 1024: ITagStream=ITagStream+Chr(ReadByte(IFile)): Next ;LETZTE/128/BYTES/ALS/STRING/ANSTELLEN SeekFile(IFile,ISize-128): For ICount=1 To 128: ITagStream=ITagStream+Chr(ReadByte(IFile)): Next ;TAGSINFO/AUS/OGG/EINLESEN If Lower(Right(FFile,4))=".ogg" Then Select FMode Case 0 IStart=Instr(ITagStream,"TRACKNUMBER=",1): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+12,Asc(Mid(ITagStream,IStart-4))-12) Case 1 IStart=Instr(ITagStream,"TITLE=",1): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+06,Asc(Mid(ITagStream,IStart-4))-06) Case 2 IStart=Instr(ITagStream,"ARTIST=",1): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+07,Asc(Mid(ITagStream,IStart-4))-07) Case 3 IStart=Instr(ITagStream,"ALBUM=",1): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+06,Asc(Mid(ITagStream,IStart-4))-06) Case 4 IStart=Instr(ITagStream,"DATE=",1): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+05,Asc(Mid(ITagStream,IStart-4))-05) Case 5 IStart=Instr(ITagStream,"COMMENT=",1): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+08,Asc(Mid(ITagStream,IStart-4))-08) Case 6 IStart=Instr(ITagStream,"GENRE=",1): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+06,Asc(Mid(ITagStream,IStart-4))-06) End Select End If ;TAGSINFO/AUS/MP3/EINLESEN If Lower(Right(FFile,4))=".mp3" Then ;ID2V2/LESEN Select FMode Case 0 IStart=Instr(ITagStream,"TRCK"): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+11,Asc(Mid(ITagStream,IStart+7,1))-1) Case 1 IStart=Instr(ITagStream,"TIT2"): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+11,Asc(Mid(ITagStream,IStart+7,1))-1) Case 2 IStart=Instr(ITagStream,"TPE1"): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+11,Asc(Mid(ITagStream,IStart+7,1))-1) Case 3 IStart=Instr(ITagStream,"TALB"): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+11,Asc(Mid(ITagStream,IStart+7,1))-1) Case 4 IStart=Instr(ITagStream,"TYER"): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+11,Asc(Mid(ITagStream,IStart+7,1))-1) Case 5 IStart=Instr(ITagStream,"COMM"): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+15,Asc(Mid(ITagStream,IStart+7,1))-5) Case 6 IStart=Instr(ITagStream,"TCON"): If IStart>0 Then IBuffering=Mid(ITagStream,IStart+11,Asc(Mid(ITagStream,IStart+7,1))-1) End Select ;ALTERNATIVE If IBuffering="" And Mid(ITagStream,1025,3)="TAG" Then ;ID2V1/LESEN Select FMode Case 0 IBuffering=Replace(Mid(ITagStream,1150,02),Chr(0)," ") Case 1 IBuffering=Replace(Mid(ITagStream,1028,30),Chr(0)," ") Case 2 IBuffering=Replace(Mid(ITagStream,1058,30),Chr(0)," ") Case 3 IBuffering=Replace(Mid(ITagStream,1088,30),Chr(0)," ") Case 4 IBuffering=Replace(Mid(ITagStream,1118,04),Chr(0)," ") Case 5 IBuffering=Replace(Mid(ITagStream,1122,30),Chr(0)," ") Case 6 IStart=Asc(Mid(ITagStream,1152,1)): If IStart<148 Then For ICount=0 To IStart: Read IBuffering: Next End Select End If End If ;MODULDATEIEN/TITEL/EINLESEN If Lower(Right(FFile,3)=".it") Then IBuffering=Mid(ITagStream,5,26) If Lower(Right(FFile,3)=".xm") Then IBuffering=Mid(ITagStream,18,20) If Lower(Right(FFile,4)=".mod") Then IBuffering=Mid(ITagStream,1,20) If Lower(Right(FFile,4)=".s3m") Then IBuffering=Mid(ITagStream,1,28) If Lower(Right(FFile,4)=".mtm") Then IBuffering=Mid(ITagStream,5,20) ;AUSGABE/BEREINIGEN IBuffering=Trim(IBuffering) For ICount=1 To Len(IBuffering) If Asc(Mid(IBuffering,ICount,1))>31 Then If Asc(Mid(IBuffering,ICount,1))<254 Then ICollector=ICollector+Mid(IBuffering,ICount,1) End If End If Next ;DATEI/FREIGEBEN CloseFile IFile ;FUNKTION/RÜCKGABEWERT Return Trim(ICollector) End If End If End Function ;STANDARD/ID3V1-TAG-GENRE/BEZEICHNUNG Data "Blues","Classic Rock","Country","Dance","Disco","Funk","Grunge","Hip-Hop","Jazz","Metal","New Age" Data "Oldies","Other","Pop","Rhythm and Blues","Rap","Reggae","Rock","Techno","Industrial","Alternative" Data "Ska","Death Metal","Pranks","Soundtrack","Euro-Techno","Ambient","Trip-Hop","Vocal","Jazz&Funk" Data "Fusion","Trance","Classical","Instrumental","Acid","House","Game","Sound Clip","Gospel","Noise" Data "Alternative Rock","Bass","Soul","Punk","Space","Meditative","Instrumental Pop","Instrumental Rock" Data "Ethnic","Gothic","Darkwave","Techno-Industrial","Electronic","Pop-Folk","Eurodance","Dream" Data "Southern Rock","Comedy","Cult","Gangsta","Top 40","Christian Rap","Pop/Funk","Jungle" Data "Native US","Cabaret","New Wave","Psychedelic","Rave","Showtunes","Trailer" Data "Lo-Fi","Tribal","Acid Punk","Acid Jazz","Polka","Retro" Data "Musical","Rock & Roll","Hard Rock","Folk" ;ERSTE/UND/ZWEITE/WINAMP-ERWEITERUNG Data "Folk-Rock","National Folk","Swing","Fast Fusion","Bebop","Latin","Revival","Celtic","Bluegrass","Avantgarde","Gothic Rock" Data "Progressive Rock","Psychedelic Rock","Symphonic Rock","Slow Rock","Big Band","Chorus","Easy Listening","Acoustic","Humour" Data "Speech","Chanson","Opera","Chamber Music","Sonata","Symphony","Booty Bass","Primus","Porn Groove","Satire","Slow Jam" Data "Club","Tango","Samba (Musik)","Folklore","Ballad","Power Ballad","Rhytmic Soul","Freestyle","Duet","Punk Rock" Data "Drum Solo","Acapella","Euro-House","Dance Hall","Goa","Drum’n’Bass","Club-House","Hardcore","Terror","Indie" Data "BritPop","Negerpunk","Polsk Punk","Beat","Christian Gangsta","Heavy Metal","Black Metal","Crossover" Data "Contemporary Christian","Christian Rock","Merengue","Salsa","Thrash Metal","Anime","JPop","SynthPop" Letztes Update : 23.05.2009 |
||
- Zuletzt bearbeitet von hectic am Sa, Mai 23, 2009 15:54, insgesamt 7-mal bearbeitet
Best-Möchtegern |
So, März 05, 2006 18:31 Antworten mit Zitat |
|
---|---|---|
cool,läuft fehlerfrei
haste fein gemacht |
||
hecticSieger des IS Talentwettbewerb 2006 |
So, März 05, 2006 18:58 Antworten mit Zitat |
|
---|---|---|
Danke, schön wenn man Feedback dazu bekommt. Werde demnächst noch ID3v1 noch einbauen. Obwohl dieses recht einfach ist. Die letzten 128 Byte der mp3-Datei mit vorgegebenen Positionen einfach auslesen... | ||
Apocalyptic |
So, März 05, 2006 19:11 Antworten mit Zitat |
|
---|---|---|
Das Auslesen funktioniert leider nicht mit jeder Datei fehlerfrei. Bei MP3s, deren Tags im UTF-16-Standard gespeichert sind, befindet sich vor jeder Information die Zeichenfolge "ÿþ" und einzelne Zeichen sind mit einem Leerzeichen getrennt.
Beispiel: Code: [AUSKLAPPEN] Dateiname :Blind Guardian\Nightfall in Middle-earth\Mirror Mirror.mp3
Tracknummer :ÿþ9 Kuenstler :ÿþB l i n d G u a r d i a n Musiktitel :ÿþM i r r o r M i r r o r Albumname :ÿþN i g h t f a l l I n M i d d l e - e a r t h Produktionsjahr :ÿþ1 9 9 8 PS: hectic hat Folgendes geschrieben: Mich hat es irgenwie genervt, das ich keine Informationen im Internet über das Speicherformat bekommen habe
Über das erste Ergebnis bei Google (http://www.id3.org/) kommst du zu dieser Datei: http://www.id3.org/id3v2-00.txt Damit solltest du auch an das Genre einer MP3 kommen. |
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
hecticSieger des IS Talentwettbewerb 2006 |
So, März 05, 2006 19:37 Antworten mit Zitat |
|
---|---|---|
Hi Apocalyptic, danke für die Info... Werde ich gleich mal versuchen zu fixen... Habe es wohl übersehen weitere Formate zu prüfen. Mp3tag V.2.24 bietet mir folgende Formate beschreiben zu können ID3v1, ID3v2, APE, APEv2... Aber was ist UTF-16? Die 16 ist wohl klar, 16Bit, sieht man ja auch an den Leerzeichen deines Beispieles... Bin nicht so der Held was English betrifft, und sich durch die kilometerlange Beschreibung durch zu kämpfen ist recht müssig... Bei den 2Byte-Text sollte es genügen das erste Byte zu löschen, da Blitz eh diese Zeichen nicht darstellen kann?!?
/EDIT: Bist du dir sicher das die von dir beschriebene Datei auch das ID3v2 besitzt? Dein Beispiellink ergibt kein Ergebnis bei einer Suche nach UTF... Kannst du mir sagen welches ASCII-Zeichen das Leerzeichen (in Hex-code) ist? |
||
Apocalyptic |
So, März 05, 2006 19:52 Antworten mit Zitat |
|
---|---|---|
In der von mir verlinkten Datei wird UTF-16 erst gar nicht erwähnt, die Seite hatte ich unabhängig von UTF-16 gepostet.
Die korrekte Lösung wäre es wohl, wenn ein String mit "ÿþ" beginnt, alle Zeichen mit dem ASCII-Code "0" zu ignorieren - auch wenn die "2 Byte"-Zeichen nicht dargestellt werden können. Letztendlich reicht es jedoch auch, das "ÿþ" und alle Zeichen mit dem ASCII-Code "0" zu löschen. Bei der Version 2.35 von Mp3Tag gibts es übrigens folgende Option: EDIT: Die Bezeichnung "Leerzeichen" in meinem ersten Post ist natürlich falsch und irre führend, es handelt sich, wie oben beschrieben um ein Zeichen mit dem ASCII-Code "0" |
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
hecticSieger des IS Talentwettbewerb 2006 |
So, März 05, 2006 22:27 Antworten mit Zitat |
|
---|---|---|
Ja danke, das mit den Leerzeichen war mir schon klar. Deshalb wollte ich ja auch den Hex-Code wissen, da es ja immer unterschiedlich sein kann... Werde dann ein Bereich markieren in welchem die Zulässigen Code an dem TagStream angehängt werden und welche nicht... Hast mir schonmal weiter geholfen, vielen dank!..
/EDIT1: Und mal eine neue Version von Mp3Tag downloaden... /EDIT2: Code wurde überarbeitet. Siehe ersten Post... |
||
INpac |
Mo, Mai 22, 2006 20:20 Antworten mit Zitat |
|
---|---|---|
hey,
hab 2 fragen: 1) kann ich über id3-tags auch die länge des mp3s auslesen? 2) hast du ma probiert, ein ins mp3 gespeicherte cover-bild auszulesen und anzeigen zu lassen? |
||
D2006Administrator |
Mo, Mai 22, 2006 20:54 Antworten mit Zitat |
|
---|---|---|
zu 1.)
Nein. Man könnte sie vielleicht drin speichern, aber das macht keiner. |
||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
INpac |
Mo, Mai 22, 2006 20:56 Antworten mit Zitat |
|
---|---|---|
wie bekomm ich denn sonst ganz fix und schnell meine mp3-länge ?
atm löse ich das noch mit der BASS.dll ... bleibt nur noch die frage wegen dem cover-image offen |
||
D2006Administrator |
Mo, Mai 22, 2006 21:00 Antworten mit Zitat |
|
---|---|---|
ausm FF:
Mp3 sind unterteilt in ich glaub die Dinger hießen "Frames". Jedes Frame kann eine bestimmte Bitrate haben und hat eine im Header stehende Bytelänge. Anhand dieser beiden Werte kann man also die Länge eines "Frames" rausbekommen und summiert natürlich die Länge des ganzen Liedes. Angaben ohne Gewähr MfG D2006 |
||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
FWeinbehemals "ich" |
So, Jan 04, 2009 14:49 Antworten mit Zitat |
|
---|---|---|
Ich habe die Funktion mal etwas erweitert sie kann jetzt Coverbilder welche im PNG oder JPEG Format eingebunden sind Herrauslesen.
Ich hoffe hectic hat nichts dagegen. Code: [AUSKLAPPEN] ;Graphics 600,200,0,2 ;SetBuffer FrontBuffer() Const ID3V2_TRACK=0 Const ID3V2_TITLE=1 Const ID3V2_ARTIST=2 Const ID3V2_ALBUM=3 Const ID3V2_YEAR=4 Const ID3V2_COMMENT=5 Const ID3V2_COMPOSER=6 Const ID3V2_ORGINATOR=7 Const ID3V2_COPYRIGHT=8 Const ID3V2_URL=9 Const ID3V2_ENCODER=10 Const ID3V2_COVER=11 Local mp3name$="D:\Fabrice\Musik\03 - The White Stripes - My Doorbell.mp3" Print "Pfad zum Cover :"+ID3v2$(mp3name,ID3V2_COVER,"D:\tmp") WaitKey End ;ID3v2-Aus-Einer-MP3-Lesen Function ID3v2$(FFile$,FMode%,Pfad$ = "");Pfad$ speicherort des Covers. ;Variablendeklarationen Local IFile% Local ICount% Local TagStream$ Local IStart% Local IRange% Local IBuffering$ Local ICollector$ Local Size = FileSize(FFile$) ;Allgemeine-Gültigkeitsprüfung If Lower(Right(FFile,4))<>".mp3" Then RuntimeError "Bitte nur mp3-Dateien eingeben!" If FileType(FFile)<>1 Then RuntimeError "Datei "+FFile+" wurde nicht gefunden!" ;Datei-Zum-Lesen-Öffnen IFile=ReadFile(FFile) ;Ersten-KByte-Einlesen For ICount=0 To 50000 ;Ersten-KByte-An-TagStream-Anfügen TagStream=TagStream+Chr(ReadByte(IFile)) Next ;Datei-Freigeben CloseFile(IFile) Select FMode ;TRACK Case 0 IStart=Instr(TagStream,"TRCK") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;TITLE Case 1 IStart=Instr(TagStream,"TIT2") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;ARTIST Case 2 IStart=Instr(TagStream,"TPE1") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;ALBUM Case 3 IStart=Instr(TagStream,"TALB") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;YEAR Case 4 IStart=Instr(TagStream,"TYER") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;COMMENT Case 5 IStart=Instr(TagStream,"COMM") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+15,IRange-5) ;COMPOSER Case 6 IStart=Instr(TagStream,"TCOM") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;ORGINATOR Case 7 IStart=Instr(TagStream,"TOPE") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;COPYRIGHT Case 8 IStart=Instr(TagStream,"TCOP") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;URL Case 9 IStart=Instr(TagStream,"WXXX") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+12,IRange-2) ;ENCODER Case 10 IStart=Instr(TagStream,"TENC") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;Cover entweder JPEG oder PNG Case 11 IFile = ReadFile(FFile) Covr = Instr(TagStream,"JFIF") Covr = Covr - 7 If Covr = -7 Then Covr = Instr(TagStream,"PNG") If Covr <> 0 Then If Asc(Mid$(TagStream,Covr-1,1)) = $89 And Covr <> 0 Then Covr = Covr - 1 Typ$ = "PNG" Else Return False EndIf Else Return False EndIf Else Typ$ = "JPG" EndIf Select Typ$ Case "JPG" SeekFile IFile,Covr Repeat If ReadByte(IFile) = $FF Then If ReadByte(IFile) = $D9 Then Rang = Count Found = True Exit EndIf count = count + 1 EndIf Forever Case "PNG" SeekFile IFile, covr Repeat If ReadByte(IFile) = 0 Then If ReadByte(IFile) = 0 Then If ReadByte(IFile) = 0 Then If ReadByte(IFile) = 0 Then St$ = Chr$(ReadByte(IFile)) + Chr$(ReadByte(IFile)) + Chr$(ReadByte(IFile)) + Chr$(ReadByte(IFile)) count = count + 4 If St$="IEND" Then Rang = Count + 2 Covr = Covr + 5 Found = True Exit EndIf EndIf Count = Count + 1 EndIf Count = Count + 1 EndIf Count = Count + 1 EndIf Count = Count + 1 Forever End Select tmp = WriteFile(Pfad$+"Cover."+Lower(Typ$)) SeekFile IFile,Covr For i=0 To Rang WriteByte tmp,ReadByte(IFile) Next CloseFile tmp CloseFile IFile IBuffering = Pfad$+"Cover."+Lower(Typ$) End Select ;Kein-Eintrag-Gefunden If IStart=0 Then Return "" ;Ausgabe-Bereinigen If Len(IBuffering)>0 Then For ICount=1 To Len(IBuffering) If Asc(Mid(IBuffering,ICount,1))>31 Then If Asc(Mid(IBuffering,ICount,1))<254 Then ICollector=ICollector+Mid(IBuffering,ICount,1) End If End If Next Return ICollector Else ;Wenn-Alles-Nichts-Nützt Return "Du Quatschkopf" End If ;Funktionsende End Function PS: Ich weiß nicht ob das die Effizienteste Methode ist. mfg ich |
||
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs |
- Zuletzt bearbeitet von FWeinb am Mo, Jan 26, 2009 21:30, insgesamt 2-mal bearbeitet
ozzi789 |
So, Jan 04, 2009 16:01 Antworten mit Zitat |
|
---|---|---|
@ich
einfach nur geil ^^ darf ich die Funktion für meinen Player benützen? Credit eintrag mehr kann ich nicht bieten >< mfg |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
FWeinbehemals "ich" |
So, Jan 04, 2009 16:10 Antworten mit Zitat |
|
---|---|---|
Klar dafür ist sie ja im Codearchiv.
mfg ich |
||
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs |
HolzchopfMeisterpacker |
So, Jan 04, 2009 18:42 Antworten mit Zitat |
|
---|---|---|
Ich finde die Lösung sehr unsauber (also, auch schon die von Hectic), da bei jedem Tag, der Abgefragt wird, die Datei neu geladen und gelesen wird
Sauberer wäre es, ein Mp3-File-Type zu machen, der sämtliche Infos speichern kann. Dann brauchts ne Funktion, die ein Mp3-File einliest und alle Tags, die im File enthalten sind, in den entsprechenden Feldern speichert und am Schluss die Type-Instanz zurückgibt. Danach kann man via MeineDatei.TMp3File\TagName auf die einzelnen Tags zugreifen. |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
FWeinbehemals "ich" |
So, Jan 04, 2009 18:59 Antworten mit Zitat |
|
---|---|---|
Es kommt ganz auf den Anwendungszweck drauf an.
Wenn man nur 2 Felder braucht dann ist es besser das so zu machen alle alle Einzulesen. Aber es ist natürlich schon richtig das wenn jemand wie Ozzi jetzt einen Music Player machen will währe es schon besser einen Type dafür zu machen. mfg ich PS: Ich habe noch einen Bug Gefixt. [Edit] Danke an Ozzi habe jetzt noch einen Bug-Gefixt welcher nur in Blitz3D auftauchte. Code: [AUSKLAPPEN] ;Graphics 600,200,0,2 ;SetBuffer FrontBuffer() Const ID3V2_TRACK=0 Const ID3V2_TITLE=1 Const ID3V2_ARTIST=2 Const ID3V2_ALBUM=3 Const ID3V2_YEAR=4 Const ID3V2_COMMENT=5 Const ID3V2_COMPOSER=6 Const ID3V2_ORGINATOR=7 Const ID3V2_COPYRIGHT=8 Const ID3V2_URL=9 Const ID3V2_ENCODER=10 Const ID3V2_COVER=11 Local mp3name$="D:\Fabrice\Musik\03 - The White Stripes - My Doorbell.mp3" Print "Pfad zum Cover :"+ID3v2$(mp3name,ID3V2_COVER,"D:\tmp") WaitKey End ;ID3v2-Aus-Einer-MP3-Lesen Function ID3v2$(FFile$,FMode%,Pfad$ = "");Pfad$ speicherort des Covers. ;Variablendeklarationen Local IFile% Local ICount% Local TagStream$ Local IStart% Local IRange% Local IBuffering$ Local ICollector$ Local Size = FileSize(FFile$) ;Allgemeine-Gültigkeitsprüfung If Lower(Right(FFile,4))<>".mp3" Then RuntimeError "Bitte nur mp3-Dateien eingeben!" If FileType(FFile)<>1 Then RuntimeError "Datei "+FFile+" wurde nicht gefunden!" ;Datei-Zum-Lesen-Öffnen IFile=ReadFile(FFile) ;Ersten-KByte-Einlesen For ICount=0 To 50000 ;Ersten-KByte-An-TagStream-Anfügen TagStream=TagStream+Chr(ReadByte(IFile)) Next ;Datei-Freigeben CloseFile(IFile) Select FMode ;TRACK Case 0 IStart=Instr(TagStream,"TRCK") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;TITLE Case 1 IStart=Instr(TagStream,"TIT2") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;ARTIST Case 2 IStart=Instr(TagStream,"TPE1") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;ALBUM Case 3 IStart=Instr(TagStream,"TALB") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;YEAR Case 4 IStart=Instr(TagStream,"TYER") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;COMMENT Case 5 IStart=Instr(TagStream,"COMM") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+15,IRange-5) ;COMPOSER Case 6 IStart=Instr(TagStream,"TCOM") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;ORGINATOR Case 7 IStart=Instr(TagStream,"TOPE") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;COPYRIGHT Case 8 IStart=Instr(TagStream,"TCOP") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;URL Case 9 IStart=Instr(TagStream,"WXXX") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+12,IRange-2) ;ENCODER Case 10 IStart=Instr(TagStream,"TENC") IRange=Asc(Mid(TagStream,IStart+7,1)) IBuffering=Mid$(TagStream,IStart+11,IRange-1) ;Cover entweder JPEG oder PNG Case 11 IFile = ReadFile(FFile) Covr = Instr(TagStream,"JFIF") Covr = Covr - 7 If Covr = -7 Then Covr = Instr(TagStream,"PNG") If Covr <> 0 Then If Asc(Mid$(TagStream,Covr-1,1)) = $89 And Covr <> 0 Then Covr = Covr - 1 Typ$ = "PNG" Else Return False EndIf Else Return False EndIf Else Typ$ = "JPG" EndIf Select Typ$ Case "JPG" SeekFile IFile,Covr Repeat If ReadByte(IFile) = $FF Then If ReadByte(IFile) = $D9 Then Rang = Count Found = True Exit EndIf count = count + 1 EndIf Forever Case "PNG" SeekFile IFile, covr Repeat If ReadByte(IFile) = 0 Then If ReadByte(IFile) = 0 Then If ReadByte(IFile) = 0 Then If ReadByte(IFile) = 0 Then St$ = Chr$(ReadByte(IFile)) + Chr$(ReadByte(IFile)) + Chr$(ReadByte(IFile)) + Chr$(ReadByte(IFile)) count = count + 4 If St$="IEND" Then Rang = Count + 2 Covr = Covr + 5 Found = True Exit EndIf EndIf Count = Count + 1 EndIf Count = Count + 1 EndIf Count = Count + 1 EndIf Count = Count + 1 Forever End Select tmp = WriteFile(Pfad$+"Cover."+Lower(Typ$)) SeekFile IFile,Covr For i=0 To Rang WriteByte tmp,ReadByte(IFile) Next CloseFile tmp CloseFile IFile IBuffering = Pfad$+"Cover."+Lower(Typ$) End Select ;Kein-Eintrag-Gefunden If IStart=0 Then Return "" ;Ausgabe-Bereinigen If Len(IBuffering)>0 Then For ICount=1 To Len(IBuffering) If Asc(Mid(IBuffering,ICount,1))>31 Then If Asc(Mid(IBuffering,ICount,1))<254 Then ICollector=ICollector+Mid(IBuffering,ICount,1) End If End If Next Return ICollector Else ;Wenn-Alles-Nichts-Nützt Return "Du Quatschkopf" End If ;Funktionsende End Function |
||
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs |
- Zuletzt bearbeitet von FWeinb am Do, Aug 27, 2009 14:41, insgesamt einmal bearbeitet
Dusselchen14 |
Do, Feb 05, 2009 18:44 Antworten mit Zitat |
|
---|---|---|
Hallo
@ Ich: Danke für das Fixen des des B3D Bugs. Allerdings verbraucht die Funktion bei mir jetzt trotz timer mordsmäßig viel cpu. mein Fehler oder Fehler in der Funktion? MFG Dusselchen14 edit: Schon gut. Mein Fehler |
||
- Zuletzt bearbeitet von Dusselchen14 am Do, Feb 05, 2009 21:00, insgesamt einmal bearbeitet
FWeinbehemals "ich" |
Do, Feb 05, 2009 19:32 Antworten mit Zitat |
|
---|---|---|
Könntest du mordsmäßig viel cpu bitte etwas Konkretisieren, brauch sie nur bei der Bildererweiterung so viel ?
Die Specs deines PC währe auch nicht schlecht. mfg ich |
||
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs |
BaschdiBetreff: Fehler bei der Tagsausgabe |
Do, Jun 03, 2010 21:25 Antworten mit Zitat |
|
---|---|---|
Hi, ich hoffe jemand macht sich die Mühe hier noch zu antworten! Danke schon mal dafür
Also ich hab mir diese Beiträge durchgelesen und sowohl den Code von Hectic als auch den von Ich ausprobiert. Meine Mp3-Dateien haben alle ihre Tags 'gefüllt', dennoch: Mit Hectic funktioniert die Tagauslese bei 90% der Musikdateien komlett, allerdings nicht bei allen! Oft gibt es angeblich keine Tracknummer und kein Genre, obwohl dieses eigentlich vorhanden ist. Das Jahr ist auch nicht immer richtig, manchmal fehlt einfach nur die letzte Ziffer (200 statt 2008) Fehler bei Titel und Autor hab ich bisher keine feststellen können (zum Glück) Ich wüsste also gerne woran das liegt, an meinen Dateien? An dem Code? etc Und wie man das dann natürlich beheben kann. Ich hab mir auch die Mp3 Dateien angeschaut und überlegt ob ein Zusammenhang zwischen dem wo ich die mp3-Dateien her habe (iTunes/mp3.de/audio-cds) und dem ob die Tagauslese funktioniert besteht... war aber nicht zu erkennen... Naja und bei Ich funktioniert das mit den Bildern gar nicht, obwohl ich auch hier Bilder in meinen Liedern gespeichert habe (MP3Tag), da kommt im Fenster dann: "Pfad zum Cover: " und mehr nicht! außerdem war die Rede von einer schnelleren, Resourcensparenden Methode über Types die Rede. Gibts sowas schon? Wo genau besteht der Unterschied? Wie macht man das? Danke! |
||
The_Baschdi@
Wer in Ogame is soll sofort zum Orden wechseln (D.O.) --- Alle Macht dem Orden |
hecticSieger des IS Talentwettbewerb 2006 |
Do, Jun 03, 2010 22:05 Antworten mit Zitat |
|
---|---|---|
Kannst du eine urheber-rechtlich unbedenkliche mp3-Datei in der die Informationen falsch ausgelesen werden zum testen hoch laden?
Edit1: Stell bitte sicher, dass du nicht noch eigene Filter zum String anwendest. Denn bei mir wird alles soweit richtig ausgelesen (Dreamplayer). |
||
Übersicht BlitzBasic Codearchiv
Powered by phpBB © 2001 - 2006, phpBB Group