ID3v2 aus mp3-Datei auslesen

Übersicht BlitzBasic Codearchiv

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: ID3v2 aus mp3-Datei auslesen

BeitragSo, März 05, 2006 11:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 05, 2006 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
cool,läuft fehlerfrei
haste fein gemacht

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 05, 2006 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, schön wenn man Feedback dazu bekommt. Very Happy 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

BeitragSo, März 05, 2006 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Damit solltest du auch an das Genre einer MP3 kommen.
Suum cuique

[ www.ffs-net.de.vu ] [ Raycaster ]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 05, 2006 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, März 05, 2006 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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:

user posted image

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 ]

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, März 05, 2006 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Mai 22, 2006 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Smile

D2006

Administrator

BeitragMo, Mai 22, 2006 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Mai 22, 2006 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
wie bekomm ich denn sonst ganz fix und schnell meine mp3-länge Smile ?

atm löse ich das noch mit der BASS.dll ...

bleibt nur noch die frage wegen dem cover-image offen Smile

D2006

Administrator

BeitragMo, Mai 22, 2006 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

FWeinb

ehemals "ich"

BeitragSo, Jan 04, 2009 14:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 04, 2009 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
@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
 

FWeinb

ehemals "ich"

BeitragSo, Jan 04, 2009 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Holzchopf

Meisterpacker

BeitragSo, Jan 04, 2009 18:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Confused

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 BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

FWeinb

ehemals "ich"

BeitragSo, Jan 04, 2009 18:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Feb 05, 2009 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

FWeinb

ehemals "ich"

BeitragDo, Feb 05, 2009 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Baschdi

Betreff: Fehler bei der Tagsausgabe

BeitragDo, Jun 03, 2010 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich hoffe jemand macht sich die Mühe hier noch zu antworten! Danke schon mal dafür Smile

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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jun 03, 2010 22:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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).

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group