Temat został mi podstępnie podsunięty na Discordzie... ale po kolei.
Quite OK Audio to dość nowy (2023) format kompresji dźwięku. Jego założeniem było niewielkie skomplikowanie algorytmu, oraz prosta specyfikacja (mieści się na
jednej stronie A4). Jakie podstawowe cechy ma ten format?
- kompresuje strumienie 16-bitowe o dowolnym próbkowaniu i liczbie kanałów
- jest stratny, podobnie jak np. MP3,
- stopień kompresji jest stały i wynosi 5:1 (dla porównania MP3 @ 128 kbps ma około 10:1),
- jakość po testach odsłuchowych mogę ocenić w okolicach powyższego MP3, może nawet minimalnie lepsza
- dekodowanie jest w miarę szybkie, na razie moja 68020 @ 28 MHz osiąga 0,9 rzeczywistej szybkości, ale dekoder nie jest jeszcze zoptymalizowany i na razie testuję dekoder dla 68000, bez wykorzystania rozkazów 020.
Jeżeli chodzi o algorytm to jest to predykcja w dziedzinie czasu, więc można QOA umieścić pomiędzy ADPCM a FLAC, zarówno jeżeli chodzi o jakość, jak i wymagania co do mocy obliczeniowej.
Napisałem dekoder tego formatu i na początek narzędzie "QoaToAiff" konwertujące pliki QOA na nieskompresowane AIFF. Dlaczego użyłem słowa "napisałem"? Ponieważ sam dekoder jest od zera napisany w asemblerze M68k na podstawie specyfikacji,
referencyjny dekoder zaś jest w C. Pewnie dałoby się go skompilować na Amidze wprost, ale ze szkodą dla szybkości.
Źródła mojego dekodera (i programu QoaToAiff) są
na GitHubie, zaś skompilowany program
na Aminecie.
Po dekoderze mam w planach player, na początek jako polecenie shella, a potem może coś z GUI. Nie zapomnę też o enkoderze, co prawda enkodowanie będzie sporo wolniejsze, ale do zrobienia. Rzecz jasna zawsze można enkodować na PC, tam - jak można się domyśleć - enkodowanie idzie jak przecinak i pięciominutowy kawałek kompresuje się sekundę albo i krócej.
Myślałem również o używaniu QOA do przechowywania np. audio w grach, niestety ten format pracuje tylko na 16 bitach. Można oczywiście skompresować dźwięk 8-bitowy dodając mu zera na młodszym bajcie, ale wtedy efektywna kompresja spadnie do 2,5:1. Zaletą QOA w takich zastosowaniach jest bardzo mały nagłówek (8 bajtów, identyfikator 'qoaf' i ilość sampli), którego można się zresztą pozbyć, i małe rozmiary kodu dekodera (660 bajtów jak ostatnio patrzyłem, ale jeszcze jest z czego zjechać). Stały (dla danej ilości kanałów) rozmiar ramki ułatwia też skakanie po strumieniu.
Asemblerowy kod dekodera ramki QOA będzie jeszcze podlegał optymalizacji, specjaliści od asemblera na EAB podsunęli mi szereg pomysłów, które będę benchmarkował i implementował. Dlatego QoaToAiff podaje czas pracy dekodera i szybkość w odniesieniu do czasu utworu. Oczywiście jeżeli tutaj ktoś ma pomysły na przyspieszenie kodu to chętnie poczytam.
Ostatnia aktualizacja: 13.04.2025 11:30:59 przez Krashan