• Nieuwe artikelen

  • Nieuwe blogs

  • SvG

    by Published on 04-Apr-03 19:36
    1. Categories:
    2. Delphi diversen

    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:

     

    _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

    ...