WMA Tags?
Übersicht BlitzBasic Allgemein
Dusselchen14Betreff: WMA Tags? |
Fr, Jan 08, 2010 2:26 Antworten mit Zitat |
|
---|---|---|
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. 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 |
Fr, Jan 08, 2010 9:35 Antworten mit Zitat |
|
---|---|---|
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 mfg |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
Dreamora |
Fr, Jan 08, 2010 10:07 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Jan 08, 2010 11:53 Antworten mit Zitat |
|
---|---|---|
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]
Ja ich weiss, ist nicht besonders schön. 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 |
Fr, Jan 08, 2010 11:55 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Jan 08, 2010 11:58 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Jan 08, 2010 16:03 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Jan 08, 2010 16:34 Antworten mit Zitat |
|
---|---|---|
für den einfachen gebrauch kann man auch einfach jedes 2. Zeichen löschen | ||
BadDeath |
Sa, Jan 09, 2010 0:43 Antworten mit Zitat |
|
---|---|---|
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 =~- |
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group