WMA Tags?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Dusselchen14

Betreff: WMA Tags?

BeitragFr, Jan 08, 2010 2:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute. Ich hab mir mal eine WMA Datei angeschaut um herauszufinden wie man denn am besten die Tags lesen könnte und entdeckte sowas:
Code: [AUSKLAPPEN]
  W M / A l b u m T i t l e     , L i e b e   I s t   F ü r   A l l e   D a   


Die einzige brauchbare Information die ich finden konnte war, dass sich die Tags am anfang der Datei befinden. Wink
Kann mir jemand vieleicht weitere Infos über diese Tags und vielleicht sogar einen Anstoß zu Umsetzung in bb geben?
z.B: Woran erkenn ich das Ende des "Tag-Blocks"? Man möchte ja nicht die gesammte Datei Dafür auslesen.
Wäre wahnsinnig freundllich^^

ozzi789

BeitragFr, Jan 08, 2010 9:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Wird wohl irgendwo ein Steuerzeichen geben, lies es mal mit readbyte aus, oder brauch n hex editor
Werde leider nicht ganz schlau, irgendwie gibts keine Doku zu dem Zeug Very Happy

mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Dreamora

BeitragFr, Jan 08, 2010 10:07
Antworten mit Zitat
Benutzer-Profile anzeigen
das werden nahezu garantiert C strings sein, sprich am ende des strings kommt ein 0 byte bevor sonst was kommt
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Dusselchen14

BeitragFr, Jan 08, 2010 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Also.
Im Hex-Editor fiel mir auf, dass der Tag-Block immer mit einem $BF endet. Könnte ich da Recht haben, oder war das nur zufall?
Und könnte man das nicht dann einfach so lösen?:
BlitzBasic: [AUSKLAPPEN]

IFile=ReadFile("1.wma")
For ICount=0 To 100000
M$=Chr(ReadByte(IFile))
TagStream$=TagStream$+m$
If m$=Chr($BF) Then Exit
Next
CloseFile ifile

yearin=Instr(tagstream$,"W"+Chr(0)+"M"+Chr(0)+"/"+Chr(0)+"Y"+Chr(0)+"e"+Chr(0)+"a"+Chr(0)+"r"+Chr(0))
enctin=Instr(tagstream$,"W"+Chr(0)+"M"+Chr(0)+"/"+Chr(0)+"E"+Chr(0)+"n"+Chr(0)+"c"+Chr(0)+"o"+Chr(0)+"d"+Chr(0)+"i"+Chr(0)+"n"+Chr(0)+"g"+Chr(0)+"T"+Chr(0)+"i"+Chr(0)+"m"+Chr(0)+"e")
year$=Mid(tagstream$,yearin+14,enctin-yearin-14)
Print Year$
WaitKey
End


Ja ich weiss, ist nicht besonders schön. Cool Aber es geht^^
@ ozzi ich konnte auch keine Doku o.ä. finden. Deshalb frage ich hier nach^^
  • Zuletzt bearbeitet von Dusselchen14 am Fr, Jan 08, 2010 11:55, insgesamt einmal bearbeitet

Nicdel

BeitragFr, Jan 08, 2010 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
yearin=Instr(tagstream$,"W"+Chr(0)+"M"+Chr(0)+"/" +Chr(0)+"Y"+Chr(0)+"e"+Chr(0)+"a"+Chr(0)+"r"+Chr(0))

C-Streams haben am ENDE EIN Nullbyte.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Dusselchen14

BeitragFr, Jan 08, 2010 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiss aber
Da sagt der Hex editor was ganz anderes.
Nämlich genau das:

Code: [AUSKLAPPEN]
yearin=Instr(tagstream$,"W"+Chr(0)+"M"+Chr(0)+"/" +Chr(0)+"Y"+Chr(0)+"e"+Chr(0)+"a"+Chr(0)+"r"+Chr(0))


Und es geht ja.
Zumindest bei mir.

BtbN

BeitragFr, Jan 08, 2010 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist ein Unicode WString, mit 16 bit pro Zeichen. Dürfte quasi unmöglich sein, den mit BB auszulesen, ohne einen wrapper dazwischen, der den String konvertiert.

Silver_Knee

BeitragFr, Jan 08, 2010 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
für den einfachen gebrauch kann man auch einfach jedes 2. Zeichen löschen
 

BadDeath

BeitragSa, Jan 09, 2010 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir letztens mal eine Quick'n'Dirty-Lösung gebastelt:

Code: [AUSKLAPPEN]
Const Tag_Autor = 0
Const Tag_Album = 1
Const Tag_Titel = 2

Function CheckDRM(File$)
   Local FileIn, Size, Tmp$
   
   FileIn = ReadFile(File$)
   If FileIn = 0 Then Return 0
   SeekFile FileIn, 128
   While Size < 256
      Size = Size + 1   
      Tmp = Tmp + Chr(ReadByte(FileIn))
   Wend
   CloseFile FileIn
   
   If Instr(Tmp, "DRM") Then
      Return 1
   Else
      Return 0
   End If
End Function



Function WMA_Tags$(File$, Attribut)
   Local Tmp$, Tmp2$, FileIn, Size%, Pos%, Byte%, IsSpace%, WasSpace%, WMA_Tags$, AndereVersion
   
   Local PosAlbum$ = "W"+Chr(0)+"M"+Chr(0)+"/"+Chr(0)+"A"+Chr(0)+"l"+Chr(0)+"b"+Chr(0)+"u"+Chr(0)+"m"+Chr(0)+"T"+Chr(0)+"i"+Chr(0)+"t"+Chr(0)+"l"+Chr(0)+"e"
   Local PosAutor$ = "W"+Chr(0)+"M"+Chr(0)+"/"+Chr(0)+"A"+Chr(0)+"l"+Chr(0)+"b"+Chr(0)+"u"+Chr(0)+"m"+Chr(0)+"A"+Chr(0)+"r"+Chr(0)+"t"+Chr(0)+"i"+Chr(0)+"s"+Chr(0)+"t"+Chr(0)+"
   
   ; die ersten 256 Bytes
   ; der Datei ab dem 64. Byte lesen
   FileIn = ReadFile(File$)
   SeekFile FileIn, 64
   While Size < 2048
      Size = Size + 1
      Tmp$ = Tmp + Chr(ReadByte(FileIn))
   Wend
   CloseFile FileIn
   
   ; jedes Zeichen durchgehen
   For Pos = 1 To Len(Tmp)
      Byte = Asc(Mid(Tmp, Pos, 1))
      
      ; Lücken ignorieren
      If Byte <> 0 Then
         ; bei einem @ aufhören
         If Byte = 64 Then Exit
         
         WMA_Tags = WMA_Tags + Chr(Byte)
         IsSpace = SplitSpace(Tmp, Pos)
         
         ; Wenn Titel, dann Schluss
         If Attribut = Tag_Titel And IsSpace = 1 Then Exit
         
         ; Wenn Autor, dann Titel "löschen" und weiter geht's
         If IsSpace = 1 And Attribut = Tag_Autor And WasSpace = 0 Then
            WasSpace = 1
            WMA_Tags = ""
         End If
      End If
   Next
   
   ; bei anderer Version anders vorgehen
   For Pos = 1 To Len(WMA_Tags)
      If Asc( Mid(WMA_Tags, Pos, 1) ) > 128 Then   AndereVersion = 1 : Exit
   Next
   
   If AndereVersion Then
      Select Attribut
         Case Tag_Autor
            Pos = Instr(Tmp, PosAutor) + 33
            
         Case Tag_Album
            Pos = Instr(Tmp, PosAlbum) + 32
            
      End Select
      
      Tmp2 = Mid(Tmp, Pos)
      WMA_Tags = Replace(Left(Tmp2, Instr(Tmp2, Chr(0)+Chr(0))), Chr(0), "")
   End If
   
   Return WMA_Tags
End Function





Function SplitSpace(In$, i)
   ; 3x Chr(0) = Trennung von Titel und Autor
   If Asc(Mid(In, i+1, 1)) = 0 Then
      If Asc(Mid(In, i+2, 1)) = 0 Then
         If Asc(Mid(In, i+3, 1)) = 0 Then
            SplitSpace = 1
         End If
      End If
   End If
   
   Return SplitSpace
End Function


Wie ich feststellen mussze, gibt es mehrere Versionen von WMA, welche ein Teil vom Format ASF entsprichen. Die Spezifikationen für ASF findet man hier: http://www.microsoft.com/windo...fspec.aspx

Klappt bei nicht DRM-geschützten Liedern bei mir ganz gut bisher. Verbesserungen sind gern gesehen ^^
-~= real coders just code in binary =~-

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group