Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Hlavička MP3 souboru
21. května 2001, 00.00 | MP3 je snad nejrevolučnější kódování audia, které člověk vymyslel. V tomto seriálu si představíme základní principy dekódování hudebních dat, hlavičky a jiných informací, potřebných pro práci s tímto, bezpochyby skvělým formátem!
MP3. Snad nejrevolučnější kódování audia, které člověk vymyslel.
V tomto seriálu si představíme základní principy dekódování hudebních dat, hlavičky
a jiných informací, potřebných pro práci s tímto, bezpochyby skvělým formátem.
Pochopení ukázek vyžaduje alespoň základní znalosti programování v C++ a znalost
významu hlavičkových souborů. Z důvodu rozsáhlosti tohoto seriálu nebudu uveřejňovat
kompletní zdrojové soubory jako přílohu, ale pouze ty části, které se budou
týkat příslušného dílu (zdrojové soubory budou v průběhu seriálu vzájemně navazovat).
Začneme tedy pěkně od začátku. V tomto díle si povíme něco o informacích skrytých v několika málo bytech hlavičky MP3 souboru. Konkrétně se jedná o 4 byty, ve kterých je uloženo vše co bude náš dekoder potřebovat pro zajištění správného dekódování. Jako první si musíme otevřít soubor, který budeme chtít dekódovat :
|
Kde InName je jméno vstupního souboru a Sec je adresa proměnné typu struct SECURITY_ATTRIBUTES (viz nápověda kompilátoru).
Jak jsme si již řekli, hlavička souboru má velikost 4 byty.
Následující tabulka nám ukáže obsazení jednotlivých bitů hlavičky informacemi, které budeme dále dekódovat.
offset (bit) | velikost (bit) | obsah |
00 | 12 | sync header |
12 | 1 | version |
13 | 2 | layer |
15 | 1 | error protection |
16 | 4 | bit rate |
20 | 2 | sample rate |
22 | 1 | padding |
23 | 1 | extension |
24 | 2 | channel mode |
26 | 2 | mode extension |
28 | 1 | copyright |
29 | 1 | original |
30 | 2 | emphasis |
Pro uložení těchto dat si musíme zvolit proměnnou typu unsigned long a to z důvodu využití plné škály od čísla 0 (mínusové hodnoty by nám zmenšily schonost pojmout informace na polovinu). Následující funkcí si tyto informační byty načteme :
|
Kde je handle na již otevřený MP3 soubor (viz. výše). V proměnné newhead máme tedy "nějaké 4 byty", ale co s nimi ? Každý programátor, který analyzuje nějaká data by měl mít jedno základní pravidlo : Před použitím dat zkontrolovat, zda jsou korektní !. Další krok tedy vede samozřejmě ke kontrole těchto dat. Kontrolu musíme provést na bitové úrovni a v podstatě kontrolujeme zda se při dekódování hlavičky budou používat "korektní" data (jako kdyby jsme ji "předdekódovali"). Provádět tuto kontrolu je lepší než ošetřovat možné chyby při samotném dekódování.
|
Nyní, pokud kontrola proběhla v pořádku, můžeme přistoupit k samotnému dekódování hlavičky. Budeme potřebovat následující definice, které slouží k uložení informací z hlavičky :
|
Struktura frame nám poslouží jako "zastřešující záznam", který bude obsahovat všechna dekódovaná data.
|
Kompletní seznam datových toků pro každý layer.
|
Musíme mít také připraven seznam možných (standartních) frekvencí.
|
A konečně deklarace proměnných a definic.
|
Nyní můžeme přistoupit k vlastnímu dekódování hlavičky. Zjištěné informace si uložíme do předem vytvořených proměnných (viz. výše). Pro případ změny hlavičky (hlavička se totiž přidává před každý "frame". Ale o tom až příště) si budeme vždy pamatovat i tu předcházející z důvodu urychlení (pokud se hlavičky neliší, není nutné novou hlavičku dekódovat).
A nyní již samotná funkce pro dekódování hlavičky
|
Myslím že obsah této lekce je již vyčerpán a dostatečně objasněn. V příštím díle si ukážeme MP3 soubor z "opačného" konce. Povíme si tedy něco o popisu skladby, o tzv. ID3 Tagu.
Zde si můžete stáhnou zdrojové kódy této lekce.
Obsah seriálu (více o seriálu):
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007