C++ mp3-Header Auslesen - Problem

JetStre4m

Lieutenant
Registriert
Nov. 2007
Beiträge
578
Hi, ich möchte mit einem C++-Programm den Frame-Header einer Mp3-Datei auslesen. Laut Wikipedia Beginnt der Frame Header mit 11 gesetzten Bits. Das Problem ist, in der mp3-Datei die ich testweise benutze gibt es jede Menge davon - woran erkenn ich denn nun genau das der Frame-Header beginnt?
 
Die Struktur ist mir bekannt, das Problem ist, ich muss den Frame-Header erstmal lokalisieren, er scheint nicht dirket am Anfang zu stehen. Dafür muss ich ja erstmal 11/12 Bits finden die auf 1 gestezt sind. Das Problem ist, dass Bitfolgen von 11 oder mehr einsen Haufenweise vorkommen - muss ich da von der ersten "11er-Folge" ausgehen?

Noch ne Frage zu folgendem Code:
Code:
QString bits;
char a[1]; //in dieser Variablen befindet sich das erste Byte der Datei

for(int x=1; x<=8; x++)
{
    if(a[0]&(1<<x)) bits->append("1");

    else
    {   
          bits->append("0");
     }
}

Damit spalte ich das Eingelesene Byte in Bits auf. Das mach ich dann mit den ersten bytes der Datei, bis ich den Header gefunden habe. Das Problem ist - wierum lese ich das Ganze?:)
Ich arbeite zum ersten Mal mit binärdateien, und bin da grad ziemlich durcheinander. angenomen ich hab 3 bytes:
Code:
11111111 //byte1
11101011 //byte2
11110101 //byte3
Wie muss das dann gelesen werden?

und laut Dieser Seite belegen die 11 "Sync-Bits" also die, an denen ich den Header erkennen kann die letzten Bits im Header...

wie genau müsste denn ein Beispielheader dann aussehen? Ich bin im Moment ziemlich verwirrt:D
 
und laut Dieser Seite belegen die 11 "Sync-Bits" also die, an denen ich den Header erkennen kann die letzten Bits im Header...
sind nur rückwärts nummeriert, wenn du über der Tabelle schaust stehn dort Buchstaben die die einzelnen Bereiche markieren, der Frame-Header müsste am Anfang der Datei stehen...

/edit: der Frame-Header steht nicht am Anfang der Datei sondern vor jedem einzelnen Frame, d.h. du hast möglicherweise mehrere Frame-Header in einer Datei

/edit2: schau dir mal die Seite hier an, dort steht beschrieben wie man die länge eines Frames anhand des Headers berechnen kann...
 
Zuletzt bearbeitet:
Hey, Danke schonmal für dieganzen Antworten...
Ich hab jetzt mal einfachmal versucht bis zum ersten vorkommen der "Sync-Bits" zu durchsuchen und mir dann die Bits ausgeben lassen.
Hier die 3 für mich relevanten bytes:
Code:
[COLOR="Red"]11111111 111[/COLOR][COLOR="Blue"]11[/COLOR][COLOR="Lime"]10[/COLOR][COLOR="Black"]0[/COLOR] [COLOR="Magenta"]0000[/COLOR]0000
Demzufolge wären die roten bits die Sync-Bits, die Blauen besagen, dass die Datei eMPEG Version 1 kodiert ist, die grünen zeigen an, dss die Datei eine Layer-2-Datei ist, das Schwarze zeigt dass die Datei geschützt ist und die Lilafarbenen zeigen die Bitrate an.(die restlichen sind mir erstmal egal)

Alles gut und schön, nur: Die Datei ist eine MPEG1 - Layer 3 Datei mit einer Bitrate von 192kbs.

Die Informationen Im Header sind also falsch, bzw es ist nicht der Frame Header(was ich eher vermute)

Hier ist nun das Problem: Wie kann ich wissen ob ich den Frame-Header erwischt habe oder nicht?

edit: ich krieg die Krise - hoffe irgendwer blickt bei dem geschreibsel noch durch, ich hab hier eine MPEG 2 - Layer 3 mp3 mit 192kbps. Laut Bitrate-Tabelle existiert sowas aber nicht - was geht jetzt ab? o0
 
Zuletzt bearbeitet:
Eine MP3 Datei besteht aus mehreren kleinen Byte Schnipseln (den sogenannten Frames), die alle mit den Syncbits anfangen. In jedem Frame ist nur ein kleines Stück des Audioinhaltes encodiert gespeichert. Der Anfang einer MP3 Datei muss nicht gleichzeitig der Anfang des Audioinhaltes sein. Es kann auch Metainformationen in Form von ID3v2 Tag sein. Bei ID3v1 war es noch leicht, weil es die letzten Bytes der Datei waren und eine feste Größe hatten. Theoretisch kann ein ID3v2 Tag auch mitten in der MP3 Datei zwischen 2 Frames sein. Zur Lösung des Problems würde ich vom Anfang der MP3 Datei Byte für Byte scannen und schauen ob das Byte den Wert 255 hat. Sollte das darauffolgende Byte die 3 höchsten Bits auf 1 gesetzt haben, bist du sehr wahrscheinlich auf einen Frameheader gestossen. Lies dann die weiteren 2 Bytes des potenziellen Headers ein. Du solltest dann 4 Bytes gelesen haben, wo das erste Byte 255 ist, beim 2. Byte die obersten 3 Bits auf 1 stehen. Zerlege die 4 Bytes in ihre Einzelteile und schaue nach ob sie gültige Werte enthalten (entsprechend den Tabellen und Werten), siehe hierzu http://www.mpgedit.org/mpgedit/mpeg_format/MP3Format.html
Sollten die Daten nicht stimmen, bist du wahrscheinlich in einem Bereich von Metadaten und musst einfach weiter nach dem nächsten potenziellen Frameheader mit den Syncbits suchen.

Hoffe das hilft dir etwas...
Grüße Rossibaer

PS: Die Bitrate kann von Frame zu Frame variieren. Es gibt nicht einen Frameheader, der für die gesamte Datei gültig ist und nur am Anfang der Datei steht, wäre auch nicht möglich, da MP3 so konzipiert wurde, das es gestreamt werden kann, d.h. auch mitten im Stream kann man anfangen und trotzdem das Lied (ab dieser Stelle) weiter hören.
 
Zuletzt bearbeitet:
Hey, Danke:)
Was ist, wenn ich nen Id3v2 Tag habe, in dem eine Bitfolge vorkommt die der eines Frame-Headers entspricht, korrekt ist, allerdings schlicht die Falschen Daten enthält? Das kann ich ja dann nicht überprüfen. Gibt es nicht eine Möglichkeit den Id3-Tag zu finden, die Größe zu bestimmen und diesen schlicht und einfach zu überspringen?
 
Schau mal in der Spezifikation von ID3v2 nach.

http://www.id3.org/id3v2.4.0-structure

So ein Tag hat ebenfalls einen Header in dem die tatsächliche Größe des Tags definiert ist. Die Tag ID selbst und die Größe des Tags sind Syncsafe. d.h. diese beiden Infos können nicht 11 Bits auf 1 gesetzt haben. Schaue ob die ID existiert, springe zu den Bytes wo die Größe steht, dann weißt du wieviele Bytes schon von vornherein übersprungen werden können. Sollte das nichts nutzen, dann eben auf die brutale Art. Scanne nach den 4 Bytes eines MP3Frames (siehe oben). Aus den Daten des MP3 Frameheader kann die Größe des Frames berechnet werden. Sollte nach diesem Frame nicht wieder ein neues Frame mit den Syncbits auftreten, dann bist du wieder in solch einem Metadatenbereich.

Ebenso könnte für dich der Sourcecode von StationRipper http://sourceforge.net/projects/stationripper/files/ hilfreich sein, da das Programm - falls du es nicht kennst - MP3 Streams von Internetradio-Stationen aufnimmt und auf der Platte speichert. Wenn du das auch mit deinem Programm machen willst, dann sei noch erwähnt das bei Internetradio meist das ICY Protokoll verwendet wird. Dabei werden zusätzlich ebenfalls Daten in den MP3 Stream eingebaut und sollten vor dem schreiben der MP3 Datei herausgefiltert werden.
 
Zuletzt bearbeitet:
Zurück
Oben