• Nieuwe artikelen

  • Hoe ziet de MP3 header eruit?

    Stijn van Grinsven ( ook bekend als SVG_1986 )
    Stijnsadres@hotmail.com

    Altijd al afgevraagd hoe je nou bepaalde informatie over een liedje te weten kunt komen zonder dat je bij WinAmp moet gaan kijken. In dit artikel kom je te weten hoe je op zoek moet gaan naar deze informatie in een mp3-bestand. Natuurlijk zijn er op het internet wel meer van dit soort artikelen te vinden, maar er zijn er maar weinig die in het Nederlands zijn.
     

    Hoe ziet de Mp3-header eruit?

    Kleine uitleg over het mp3-header:

    goed, we beginnen meteen met 2 problemen:

    Bij de meeste Mp3-bestanden zit er nog een ID3 header voor

    We moeten ervoor zorgen dat de ID3-header niet wordt gelezen alsof het de mp3-header is. Wat dit zou natuurlijk fout zijn.

    De mp3-header is in plaats van bytes opgebouwd uit bits.

    Hierdoor moet er telkens bepaalde bits worden uitgelezen. maar hoe je dat gaat doen mag je zelf bepalen.

    De echte header van een mp3-bestand begint met 11x een gesette bit, dus 11x een '1'. Hierdoor is het mogelijk om de echte mp3-header op te zoeken door te zoeken naar 11 gesette bits, hierdoor is het ID3-tag probleem opgelost.

    Je zoekt dus een mp3-bestand door naar een byte die een waarde heeft van 255. dan lees je de volgende byte uit en kijk je of de 1e 3 bits zijn geset.

    Simpele uitleg over ID3:

    Het ID3 is een erg handige uitvinding omdat hierin de gegevens over een liedje kan worden gezet. Zoals de Artiest, de titel van het liedje, het Genre en nog meer. Van de ID3 zijn 2 versies. De 1e versie is de makkelijkste, want deze bestaat in totaal uit 128 bytes en staat op het einde van het bestand. Maar, versie 2 bestaat uit een onbekend aantal bytes en staat bovenaan het bestand. hierdoor ontstaat dus het 1e probleem, omdat je niet weet hoeveel bytes er moeten worden overgeslagen voordat de mp3-header begint.

    Bits & Bytes:

    De bits en bytes zijn een beetje moeilijk, want deze hebben een rare volgorde ( om het zo maar even te noemen ), zie het voorbeeld:


    7 6 5 4 3 2 1 0___ 15 14 13 12 11 10_ 9_ 8

    x x x x x x x x____ x__ x__ x__ x__ x__ x__ x_ x
     

    zoals je ziet begin je telkens te tellen van rechts, maar elke byte komt weer van links.

     

    Terug naar het Mp3-bestand:

    Nu de Mp3-header nog,

    Een mp3-header ziet er zo uit:

    Tmp3header = Record
    ___ Mpeg_version_________ : Tmp3Version;
    ___ Emphasis________________ : Tmp3Emphasis;
    ___ Protection_______________ : Boolean;
    ___ Copyright_______________ : Boolean;
     __ Padding__________________ : Boolean;
    ___ Bitrate_Index__________ : Word;
    ___ Mode_ext_______________ : Byte;
    ___ Channel_mode________ : TMP3Channel_mode;
    ___ Layer______________________ : TMP3Layer;
    ___ Sampling_rate_________ : Word;
    ___ Original___________________ : Boolean;

    End;

     Let op dat je een Word gebruikt bij de Bitrate en de Sampling rate, dit worden namelijk waardes hoger dan 256.

     bij deze declaratie van de TMp3Header zijn nog wat andere declaraties nodig, anders is deze incompleet:

    TMP3Channel_mode = (MCMStereo, MCMJoint_stereo, MCMDual_channel, MCMSingle_channel);
    TMP3Version = (MV_ERROR, MV_MPEG_1, MV_MPEG_2, MV_MPEG_2_5);
    TMP3Layer = (ML_ERROR, ML_I, ML_II, ML_III);
    TMP3Empasis = ( ME_NONE, ME_50_15ms, ME_RESERVED, ME_CCIT_J17);


    Hier zijn de conversies naar een String, zodat hierover niet moeilijk hoeft worden gedaan:

    Version_String: array [0..3] of String ________        =
    _ _____________________ ('Error', 'MPEG I', 'MPEG II', 'MPEG III');
    Layer_String: Array [0..3] of String          
              =__
                            ('Error', 'Layer I', 'Layer II', 'Layer III');
    Channel_String: Array [0..3] of String _______         =
                            ('Stereo', 'Joint Stereo', 'Dual Channel', 'Single channel');
    Emphasis_String: Array [0..3] of String _____       =
                            ('None', '50/15 ms', 'Reserved', 'CCIT J.17');

     

    Ik ga nu verder met hoe de header eruitziet en hoe met de info van de header moet worden opgegaan. De header bestaat uit 4 bytes ( 32 bits ). Ik ga nu verder met de 32 bits, omdat het dan misschien duidelijk is, let wel op dat de 11 gesette bits meegerekend zijn in deze 32 bits.

     

    Hier een plaatje hoe de header eruit ziet:


    Hier zie je heel snel hoeveel bits elk deel van de header nodig heeft. Toch staat hier nog een keer het aantal bits dat je nodig hebt in een tabel:

     

    Deelnaam van header

    Benodige bits

     

     

    Frame Sync

    11

    Mpeg Version

    2

    Layer description

    2

    Protection

    1

    Bitrate

    4

    Sampling rate

    2

    Padding

    1

    Channel mode

    2

    Mode Extension

    2

    Copyright

    1

    Original

    1

    Emphasis

    2

     

    Let op! vergeet de bit die geen functie heeft niet. Deze staat niet in de tabel maar staat dus wel in de mp3 zelf!!!

     

    Uitleg over alle delen van de MP3-header:

     

    Frame sync:

    Dit toont het begin aan van de header.


    Mpeg Version:

    Hierin staat de versie van het mp3-bestand, hier een overzicht van de mogelijkheden:

    00

    Mpeg Version 2.5

    01

    Bezet

    10

    Mpeg Version 2

    11

    Mpeg Version 1

     

     

     

    Layer description:

    Hierin vindt je het layer-type terug, ook hier een overzicht van de mogelijkheden:

    00

    Bezet

    01

    Layer III

    10

    Layer II

    11

    Layer I

     

     

     


    Protection bit:

    Met deze bit kun je kijken of er wel of geen beveiliging opzit, met beveiliging bedoel ik of er wel of geen CRC in de mp3 zit. Hier de mogelijkheden:

    0

    Beveliging door midden van CRC

    1

    Geen beveiliging

     

    Bitrate:

    Dit is een 4-bit getal, die ook nog eens afhankelijk is van de Mpeg versie en van de Layer. Dus misschien een beetje lastig, hier de tabel:

    Bits 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
    MPEG1 layer I free 32 64 96 128 160 192 224 256 288 320 352 384 416 448 Error
    MPEG1 layer II free 32 48 56 64 80 96 112 128 160 192 224 256 320 384 Error
    MPEG1 layer III free 32 40 48 56 64 80 96 112 128 160 192 224 256 320 Error
    MPEG2 layer I free 32 48 56 64 80 96 112 128 144 160 176 192 224 256 Error
    MPEG2 lay II & III free 8 16 24 32 40 48 56 64 80 96 112 128 144 160 Error

    Error betekent dat er iets mis is, het beste is dan om te stoppen met het bestand lezen.
    Verder zijn deze getallen allemaal Kilobits.

     

    Sampling rate:

    Dit is het aantal hertz van het lied, hierbij de tabel:

    Bits

    MPEG1

    MPEG2

    MPEG2.5

     

     

     

     

    00

    44100

    22050

    11025

    01

    48000

    24000

    12000

    10

    32000

    16000

    8000

    11

    Bezet

    Bezet

    Bezet

     

     

     

     

    Padding:

    Padding is bedoeld om de bitrate exact te maken.

    0

    Er wordt niet gepadded

    1

    Er wordt wel gepadded

    Channel mode:

    Dit staat voor Stereo enzo, zie de tabel:

    00

    Stereo

    01

    Joint stereo ( Stereo )

    10

    Dual channel ( Stereo )

    11

    Single channel ( Mono )

     

     

     

    Mode extension

    Dit is een extra informatie voor als de Channel mode op Joint stereo staat.

    Bits

    Layer I & II

    Layer III

    Intesity stereo

    MS stereo

    00

    Bands 4 to 31

    Off

    Off

    01

    Bands 8 to 31

    On

    Off

    10

    Bands 12 to 31

    Off

    On

    11

    Bands 16 to 31

    On

    On

    _

     

     

     


    Copyright en original:

    Eerst de tabel:

    0

    Niet

    1

    Wel

    _Voor Copyright:

    Het lied is copyrighted of het is het niet

    Voor Original:

    Het lied is het originele of het is een copy van het originele liedje.

    Ik heb deze informatie gehaald van:

    http://home.swipnet.se/grd/mp3info/frmheader/index.html


    de unit die hiermee is gemaakt is getest over verschillende mp3-bestanden. Bij elk van deze bestanden waren de gegevens goed. De inhoud van dit artikel zijn dus te vertrouwen.

    ik heb de bovenstaande pagina vertaald en heb er een betere uitleg bijgegeven hoe het moet worden uitgelezen. Ik hoop dat in ieder geval 1 iemand er blij mee is. En ik hoor het graag als er fouten zijn, of als je mij gewoon wilt bedankt.

    Ook kun je mij vragen naar de complete code op dit mailadres. Maar het is eigenlijk de bedoeling dat je zelf een mp3-header lezer gaat maken.

    Stijn van Grinsven
    lid van www.NLDelphi.com

  • Nieuwste forumberichten

    Christian

    FTDI 64 bit invalid handle

    Lekker bezig,

    Heb even een test gedaan warbij ik in de originele code de handle heb vervangen door de TFT_Handle = pointer.
    Hierna

    Christian Yesterday, 15:18 Go to last post
    flabber

    FTDI 64 bit invalid handle

    Nog een stukje vanuit mijn kant dan... het is maar een klein stukje hoor, je bent waarschijnlijk zelf al wel verder gekomen. Nog geen rekening gehouden

    flabber Yesterday, 14:30 Go to last post
    Christian

    FTDI 64 bit invalid handle

    met de hulp van Flabber een eigen unit gemaakt (met enkel de open close functie)
    Hiermee kan ik het device openen en sluiten op zowel 32 / 64 bit

    Christian Yesterday, 13:14 Go to last post
    rvk

    Met RTF-code een tabel zetten op RichMemo

    RichMemo heeft geen notie van wat er in de richedit dll gebeurd met een tabel. Dus het enige dat ik me voor kan stellen is een karakter onder de tabel

    rvk Yesterday, 11:53 Go to last post
    flabber

    FTDI 64 bit invalid handle

    een klein opzetje dan, niet gechecked:

    Delphi Code:
    1. type
    2.   PFT_HANDLE = ^TFT_HANDLE;
    3.   TFT_HANDLE = pointer;
    4.   TFT_STATUS = ULONG;

    flabber Yesterday, 11:14 Go to last post
    Dubbeld

    Met RTF-code een tabel zetten op RichMemo

    Hallo allemaal,

    Ik zet via RTF-code een tabel op Richmemo. De tabel bestaat uit één kolom. Deze kolom
    heeft een breedte van X cm

    Dubbeld Yesterday, 11:00 Go to last post