mp3 frame-header



  • Hallo,

    ich habe bereits mit Google einige THemen dazu gefunden und auch gelesen,
    da ich jedoch erst vor einigen Wochen angefangen habe mit C++, blicke ich da allmählich nicht mehr durch.

    Also folgendes:
    ich will eine Mp3-Datei einlesen und dann die Größe (in Bytes) jedes Frames berechnen (die Formel dazu habe, auch wie der Frame-Header aufgebaut ist)

    Ich weiß, dass ein Frame-Header aus 32 Bit besteht.

    Ich lese also nun die 1. 4bytes ein.

    Doch wie baue ich nun aus diesen 4 Bytes mir eine Struktur?

    Google ergab diesen Code:

    typedef struct T_MP3HEADER{
      union{
        struct{
          unsigned int byte4:8;
          unsigned int byte3:8;
          unsigned int byte2:8;
          unsigned int byte1:8;
        }e;
        struct{
          unsigned int Emphasis    :  2;
          unsigned int Original    :  1;
          unsigned int Copyright   :  1;
          unsigned int Mode_Ext    :  2;
          unsigned int Mode        :  2;
          unsigned int Private     :  1;
          unsigned int Paddig      :  1;
          unsigned int Samplefrq   :  2;
          unsigned int Bitrate     :  4;
          unsigned int Protection  :  1;
          unsigned int MPEGLayer   :  2;
          unsigned int MPEGVersion :  1;
          unsigned int SyncWord    : 11;
        }a;
      }h;
    }MP3HEADER;
    

    hier kann man wohl die einzelnen Bits setzen, doch WIE mache ich das?
    Und wie lese daraus dann die Bitrate?

    Die Tabelle dazu kenn ich schon, doch ich blicks nicht. 😕

    (Wie man eine Datei einliest weiß ich auch. Doch wie les ich aus einem Byte die bits?)

    Grüsse,

    ein Verwirrter FaaB



  • MP3HEADER mp3header;
    
    // mp3header füllen...
    
    unsigned int Bitrate = mp3header.h.a.Bitrate;
    


  • ~Bits schrieb:

    MP3HEADER mp3header;
    
    // mp3header füllen...
    
    unsigned int Bitrate = mp3header.h.a.Bitrate;
    

    ok damit hol ich mir n integer aus der struktur der für die bitrate steht, das ist jedoch dann immer noch nicht die bitrate. @@



  • // gelöscht, war unsinnig 😃



  • ok damit hol ich mir n integer aus der struktur der für die bitrate steht, das ist jedoch dann immer noch nicht die bitrate. @@

    s. http://de.wikipedia.org/wiki/MP3
    Dort gibt es eine Tabelle mit den 16 möglichen Werten je Layer-Format.



  • das heisst ich muss den Bitrate Wert als Binär interpretieren und daraus errechnen welche bitrate es nun ist?



  • Mir scheint, du solltest dich erst mit einfacheren Dingen beschäftigen.

    Du weißt anscheinend nicht, was die Schreibweise "unsigned int Bitrate: 4;" bedeutet. Damit werden genau 4 Bits innerhalb der Struktur reserviert.
    Dies bedeutet, daß dort genau einer der Werte 0 bis 15 (d.h. 2^4 = 16) stehen kann.
    Und diesen Wert liest du dann mittels meines ersten Postings aus.
    Dann erzeugst du dir ein Array entsprechend der Bitraten-Tabelle und greifst mit der Bitrate als Index darauf zu und schon hast du die gewünschte Bitrate.



  • du hast reht, ich weiß nicht, was unsigned int bedeutet - kann es mir jetzt nach deinem posting halb wegs denken und weiß, wonach ich nun weiter suchen muss 🙂

    aber mit einfacheren dingen beschäftigen ist nicht so meine art..
    ich suche mir immer große sachen aus um daran zu lernen, da es mich mehr fordert und mich dadurch auch mehr motiviert.

    ich habe in c++ bereits sockets geschrieben (und verstehe sogar, WAS ich da geschrieben habe :D)

    danke nochmal für deinen tipp ^^



  • FaaB schrieb:

    aber mit einfacheren dingen beschäftigen ist nicht so meine art..

    sollte es vllt. aber werden

    FaaB schrieb:

    ich suche mir immer große sachen aus um daran zu lernen, da es mich mehr fordert und mich dadurch auch mehr motiviert.

    und wenn es zu groß ist, elendig daran zu scheitern und zu verzweifeln

    FaaB schrieb:

    ich habe in c++ bereits sockets geschrieben (und verstehe sogar, WAS ich da geschrieben habe :D)

    ist jetzt auch nicht das schwierigste, aber ich finde das schonmal nicht schlecht...

    naja jedem das seine, ich lass dir mal deine lernmethode, vllt. haste ja glück und/oder bist extremst begabt...aber ein grundlagentutorial schadet nie...



  • Ich hatte angefangen ein C tutorial zu lesen (woher ich auch weiß was ein Vektor ist, was ein pointer is etc). Jedoch kamen dann immer nur noch sachen, die ich von anderen Scriptsprachen schon kenne.

    insgesammt habe ich schon min. 10 C/C++ Tutorials voraugen gehabt, aber bei allen ging es nur um wahres anfänger zeugs wie "Was ist eine Variable.." oder "Wie gebe ich etwas aus"

    Und das war bisher bei allem, was ich gelernt habe (PHP, TCL, MSL, VB.NET)

    Das mit den Sockets war echt hart ^^
    Ich hatte dazu ein Tutorial gefunden, jedoch war der Author nicht sehr begabt in sachen C++ - weshalb sein Code nicht funktionierte - das konnte ich dann aber mit hilfe von MAN Pages zum laufen bringen 🙂


Anmelden zum Antworten