4Byte Header bitweise auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Bei einer MP3-Datei sind die ersten 32 Bit (4 Byte) der Header.

Code: Alles auswählen

datei = open("lied.mp3")
header = datei.read(4)
datei.close()
Nun sind in header die Daten aber nicht byteweise sondern bitweise enthalten.
Die ersten 12 Bit sind z.B. das "SyncWord" usw.
Wie kann ich nun die einzelenen Bits auslesen?
Gruß, Johannes
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Also da musst du halt einfach maskieren oder bit schieben.

z.B. wenn du es mit struct zuerst in eine zahl wandelst:

Code: Alles auswählen

sync = struct.unpack('>H',data[:2])[0] >> 5
ich habs so gemacht:

Code: Alles auswählen

sync = (buff[0]<<3) | (buff[1]>>5)
Nacher kannst du einfach sync == 0xEFF machen.

Aber eins solltest du noch beachten. Der Header ist selten am Anfang der Datei. Häufig ist der ID3v2 Tag vor dem ganzen File oder auch sonstige Daten, weil eine MP3-Datei hat keinen Header, nur die einzelnen Frames in der Datei haben einen (sprich so 9000 Frames haben einen).
Und der FrameSync ist nur 11Bits lang nach der Doku von MP3-tech

Gruss

PS: Hab eben auch mal ein Parser für die MP3's gemacht und der funktioniert auch bei den meisten Files (mit ID3v2 überspringen und sonstige sachen)
BlackJack

Da wirst Du mit verschieben (`>>`) und ausmaskieren (`&`) arbeiten müssen.

Code: Alles auswählen

In [23]: datei = open("lied.mp3", 'rb')

In [24]: header = struct.unpack("=I", datei.read(4))[0]

In [25]: header >> (32-12)
Out[25]: 1353L
Höhere Bits ausmaskieren ist hier nicht nötig, weil es ja schon die obersten 12 Bits sind.
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Vielen Dank für die Antworten.
Das mit dem Verschieben werde ich mir heute noch ansehen und auch gleich ausprobieren.

Ich habe nämlich ein Programm geschrieben, welches den alten ID3v1 Tag von allen MP3-Liedern eines Verzeichnisses ausliest und daraus dann einen neuen Verzeichnisbaum aufbaut:

Code: Alles auswählen

artist
  album
    lied
    lied
  album
   lied
artist 
Das Programm werde ich hier auch mal vorstellen, aber ich muss noch ein paar Feinheiten einbauen.

Mein Freund wollte jetzt aber noch die Möglichkeit einer Duplikatenerkennung. Darum wollte ich auch den Header auslesen.
Wo der ganau anfängt und wie oft der enthalten ist - darüber hatte ich mir noch keine großen Gedanken gemacht.
Die Länge vom ID3v2 -Tag muss ich ja auch noch rauskriegen..

*dummer Freund* :-)
Gruß, Johannes
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nur so nebenbei... Unter windows nehme ich dazu die alte Version (v2.3.4) von ID3-TagIT. Dort kann man unter "File/Organize files" genau das machen was du dir basteln willst. Dort kann man auch auswählen, ob ID3V1 oder ID3V2 verarbeitet werden soll... (Die neue Version ist ziemlich doof geworden :( Total Bund und benötigt das .NET Framework 1.1)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Zum ID3 Tags (alle Versionen) in Python auslesen eignet sich das id3reader-Modul von Net Batchelder ganz gut.
Antworten