A w ogóle wiesz na czym polega dekodowanie mp3?
Napiszę to tutaj. Jak nie Tobie to może komuś innemu się to przyda.
Sama cześć odpowiadająca za właściwą kompresję jest jak zwykle bardzo prosta. Chodzi mi o transformatę iMDCT, specjalną dekwantyzację i o dekodowanie Huffmana. Wszystko się niezwykle komplikuje tylko dlatego, że jest wiele wariantów ustawienia kompresji. Jest Single Channel, Stereo, Joint Stereo, Dual Channel. Jest wiele różnych przepływności bitowych. Są jeszcze różne warianty przesyłania jakichś współczynników skalowania i mnóstwo innych pierdołów.
Cały algorytm oprócz prostych procedur do dekodowania Huffmana, dekwantyzacji i transformaty iMDCT musi zawierać mnóstwo przełączników które będą odpowiednio sterowały obliczeniami.
I teraz jak się dekoduje:
Szukamy w pliku mp3 początku ramki. Zaczyna się ona specjalną sekwencja bitów. Jest to „1111 1111 1111”. Potem jest jeszcze 20 bitów które oznaczają rodzaj warstwy (I, II lub III), kodowanie stereo lub jego brak, przepływność bitową , częstotliwość próbkowania i inne rzeczy. Czyli cały nagłówek ma 32 bity (4 bajty).
Potem jest wsadzone CRC które se można sprawdzić jak się chce.
Potem przed właściwymi danymi jest jeszcze ogromna ilość danych które są najbardziej skomplikowane do wykorzystania. Dane są krótkie, po kilka bitów, ale jest ich kilkanaście.
Są tam powstawiane różne informacje o stopniach kompresji różnych współczynników skalowania i chyba czegoś tam jeszcze. Jest ich mnóstwo i każdy tyczy się czego innego. I w dodatku wystąpienie niektórych współczynników jest zależne od wystąpienia innych, albo bezpośrednio jest zaznaczone jakimś bitem. Czyli najprościej mówiąc trzeba uważać przy wczytywaniu tych współczynników bo niektórych po prostu nie ma.
I w zależności od tego które współczynniki są a których nie ma trzeba odpalić odpowiednią procedurę dekodującą. Możliwe że wystarczy jedna procedura dekodująca, ale wtedy trzeba będzie brakujące współczynniki poustawiać na jakieś domyślne wartości. Niektóre na 1, inne na 0 albo jakość tak. Jeszcze do tego nie doszedłem. I to jest moim zdaniem najtrudniejsze, bo wariantów wystąpienia lub nie wystąpienia współczynników jest bardzo dużo.
No i jak już uda nam się przez to przebrnąć to teraz jest już łatwo.
Po tych współczynnikach są zakodowane Huffmanem dane.
Dekodujemy za pomocą stałej tablicy, bo drzewo Huffmana jest stale. Chodzi mi o to że indexujemy tablicę wartościami które odczytamy z ramki mp3. To nie jest takie proste, bo indexy mogą mieć różne długości, ale i tak jest to dość proste do zrobienia. I jak to zrobimy to już prawie mamy współczynniki do transformaty iMDCT.
Teraz trzeba je zdekwantyzować. To też jest proste. Podstawiamy do jednego wzoru i liczymy. Oczywiście ten wzór musi uwzględniać brak niektórych współczynników skalowania albo musi to być kilka wzorów i wybieramy odpowiedni w zależności od tego których współczynników skalowania brakuje.
Jak to zrobimy to robimy jednowymiarową transformatę iMDCT. To dopiero jest łatwe, choć zasada działania transformaty iMDCT jest bardzo trudna do zrozumienia. Ale nikt nie musi jej rozumieć. Ważne że kod programu który ją realizuje jest krótki i łatwy do napisania.
Możliwe że jeszcze trzeba będzie skalować uzyskane po transformacie iMDCT próbki, ale do tego też jeszcze nie doszedłem.
I teraz w zależności od tego w jakim standardzie Stereo dźwięk był zakodowany obliczamy próbki dla obydwu kanałów. To też jest banalne. Są na to bardzo proste wzory. Jak dźwięk był mono to nic nie przeliczamy bo od razu mamy próbki monofoniczne.
I to w zasadzie tyle.
Teraz tylko odtwarzamy próbki z prędkością odtwarzania taką jaka była podana w nagłówku ramki.
Oczywiście jedna ramka zawiera tylko kilka milisekund dźwięku. Ramek w pliku o długości powiedzmy 3 minuty będzie więc kilkanaście tysięcy. I każdą następną ramkę trzeba zakończyć dekodować zanim zakończy się odtwarzanie próbek z poprzedniej ramki. To już chyba oczywiste.
Jeszcze tylko jest jeden problem, mianowicie to że nie wszystkie dane do dekodowania Huffmana muszą być w jednej ramce. Jak się nie zmieszczą to mogą być w poprzedniej lub w następnej. Gdzieś w ramce jest zapisane czy są wszystkie w tej ramce, czy trochę jest w innych i oczywiście wtedy jest jeszcze wskaźnik do tych danych.
Ale się rozpisałem. I pewnie jest tu dużo błędów. Wszystko napisałem tak po swojemu tak jak to zrozumiałem ze specyfikacji 11172-3.
Mam tą specyfikację w piku pdf. Niestety nie pamiętam skąd to ściągnąłem więc nie dam linka. A jak to umieszczę na elektrodzie to jakiś moderator mi pojedzie że to jest w necie i nie powinienem tego umieszczać na elektrodzie. Niestety w tym pliku brakuje tabel do dekodowania Huffmana (brakuje stron. W spisie treści to jest).