Несколько лет назад на Habrahabr'е был опубликован весьма интересный по своей идее тест, заключавшийся в проверке качества кодеров путём многократного перекодирования трека одним и тем же кодером.
Само собой, эта методика тестирования качества не выдерживает никакой критики, и на основе результатов такого кодирования делать выводы непосредственно о качестве кодера нельзя (хотя бы потому, что он здесь применяется в условиях нестандартных, крайне далёких от реальных). Однако, как я уже сказал, сама идея интересна, чисто с исследовательской точки зрения.
Сегодня я хотел бы несколько доработать и расширить этот тест, а также всё-таки попытаться сделать на его основе какие-то выводы.
Прежде всего я решил исключить из теста влияние конечной разрядности, и для декодирования стал применять не LAME с выходом 16-bit PCM, а декодер mpg123 с 24-битным выходом. Также я отрегулировал громкость входного файла так, чтобы в процессе перекодировки она не превысила 100%, так как фактически LAME с плавающей точкой на входе работать не умеет (выполняется преобразование в фиксированную).
Другим отличием моей методики является то, что я сохраняю все промежуточные файлы кодирования, чтобы затем иметь возможность оценить динамику изменения параметров.
Методика
Итак, вот мой доработанный bat-файл кодирования:
@for /L %%i in (1,1,%2) do @(
@echo -------------------------------------------------------------------------------
@echo -- Iteration %%i
@echo -------------------------------------------------------------------------------
lame %3 -q 2 --noreplaygain ~temp.wav -o ~temp%%i.mp3
mpg123 -e s24 --wav ~temp.wav ~temp%%i.mp3
)
@del ~temp.wav
pause
Строка запуска выглядит так:
mp3_xcode test.wav 100 "-b320"
То есть, мы запускаем кодирование тестового файла LAME с заданными параметрами (в примере указан VBR V2), затем декодируем его (с помощью декодера pg123) обратно в 24-bit PCM WAV, снова кодируем в LAME и т. д., заданное количество раз. Все полученные MP3 файлы сохраняются под своим номером.
Для теста я выбрал фрагмент композиции Mark Knopfler — Baloney Again (Sailing to Philadelphia, 2000) в формате 24 бит 48 кГц. Во избежание клиппинга я занизил уровень громкости на 3 дБ (0.707).
После кодирования я выполняю анализ таких параметров как пиковый уровень и средний битрейт (для VBR) каждого файла, а также выполняю слепую оценку качества отдельных образцов в ABC HR:
Затем все полученные данные анализируются в Excel.
Тестирование MP3
Я провёл эксперимент в трёх режимах — 128 kbps CBR q2, VBR V2, 320 kbps CBR q2, с использованием LAME 3.99.5. Количество итераций — 100. Значение параметра -q равное двум выбрано по той причине, что при нулевом скорость кодирования становится невероятно низкой, а слышимого прироста качества это не даёт (в прошлом доказано слепыми тестами).
Ознакомимся с графиками зависимости различных параметров от количества итераций (проходов кодирования).
Весьма любопытно: уровень MP3 128 kbps по мере перекодирования затухает строго по экспоненте (подтверждается аппроксимацией в Excel). Уровень VBR V2 меняется в обе стороны, пока к 15-й итерации не устанавливается на фиксированном значении (примерно на 0.5 дБ выше исходного). CBR 320 ведёт себя довольно странно, со скачком после 70-й итерации.
Здесь мы снова видим отсутствие особо значимых изменений после 15-й – 20-й итерации.
Ну и конечно, что нас наиболее интересует — субъективная оценка качества. Для CBR 320 качество затухает уже начиная с 3-го прохода, приблизительно по экспоненте, опускаясь до уровня 1 (очень неприятные искажения) примерно на 70-м проходе.
Для CBR 128 качество затухает также по экспоненте, но очень и очень быстро, причем с каждым проходом полезный сигнал подавляется всё больше и больше — что мы и видели на графике уровня — к восьмому проходу остаются практически одни артефакты.
Не менее интересно ведёт себя модель VBR. Мы видим затухание по экспоненте, достигающее уровня 2 (неприятные искажения) к 10-му проходу, после чего на протяжении последующих 90 проходов аудио контент фактически остаётся неизменным, как и пиковый уровень на графике выше.
Создаётся впечатление, будто к 10-му проходу психоакустическая модель VBR выбросила из сигнала всё, что могла, и более делать ей с сигналом нечего. Это во многом напоминает понятие собственной функции в математике (например, для оператора дифференцирования это экспонента), т. е. фактически после десятого прохода мы получаем собственную функцию оператора кодирования, на которую он совершенно не может повлиять.
К сожалению, о причинах такого поведения кодера без глубоких познаний в области функционирования алгоритмов судить сложно. Однако я обязательно вынесу этот вопрос на рассмотрение в одной из тем HydrogenAudio.
А теперь давайте посмотрим, как ведут себя в аналогичных условиях более новые кодеки.
Кодирование Vorbis, AAC, Opus
Я слегка модифицировал bat-файлы для использования с кодерами и декодерами других форматов. Привожу строки, используемые мною для кодирования /декодирования:
qaac 2.44 (CoreAudioToolbox 7.9.9.3)qaac -V90
qaac -D
Oggenc2 libvorbis 1.3.4 / Oggdec 1.10.1
oggenc2 -b 192
oggdec -b 5
Opus 1.1
opusenc -b 192
opusdec --float
Таким образом, все файлы кодировались-декодировались в формате с плавающей точкой.
Vorbis
У Vorbis наблюдается практически линейное затухание качества параллельно с ростом артефактов и шумовых составляющих. Артефакты становятся слышны уже на втором проходе, к 12-й итерации качество достигает наименьшего значения на шкале субъективной оценки, однако продолжает и далее стабильно ухудшаться. Рост уровня искажений также отражается и на графике пикового уровня — peak level возрастает по экспоненте.
По результатам можно сделать предположение, что Vorbis стабильно подмешивает к сигналу некоторый уровень шума.
Opus
У Opus ситуация лучше: до 8-го прохода звучание неотличимо от оригинала, далее постепенно начинают появляться призвуки, похожие на постукивание, с фазовым сдвигом между каналами. Качество уменьшается по логарифмическому закону и к 100-му проходу его субъективный уровень достигает 1.5 балла. Пока это наилучший результат.
Битрейт имеет тенденцию к линейному уменьшению, пиковый уровень ведёт себя довольно странно, с изменением в обе стороны до 35-го прохода и со скачком после 90-го прохода.
AAC
В сравнении с другими кодерами QAAC демонстрирует потрясающие результаты: его параметры по мере перекодирования практически не изменяются, а главное — качество неотличимо от оригинала даже после сотого прохода.
Выводы
Что ж, в данном случае мы можем оценить только тенденцию, и только на основе её оценки можно строить какие-то догадки. Прежде всего, в тесте наиболее сильно проявились те самые специфические шумы Vorbis, которые иногда проявляются на сложных киллер-семплах. Как я уже сказал, можно предположить, что кодер Vorbis при каждом кодировании, вне зависимости от контента, подмешивает к нему некий шум. Об этом говорит стабильное возрастание пикового уровня, битрейта и вообще мощности искажений: к сигналу подмешивается шум, его амплитуда и энтропия возрастает.
Касаемо MP3 можно заключить, что в режиме CBR, особенно на низком битрейте, он имеет тенденцию к подавлению полезного сигнала — постепенно отбрасывая его спектральные составляющие; в итоге остаются одни артефакты. В режиме 320 kbps кодер показал относительно неплохие результаты, а в режиме VBR мы увидели нечто вроде адаптивного кодирования: к сигналу явно ничто не подмешивалось, после того как психоакустическая модель несколько раз обработала файл, далее отбрасывать какие-либо составляющие она отказывается: качество, битрейт и пиковый уровень остаются стабильными.
Хороший результат показал Opus, качество которого, в отличие от других кодеров, уменьшается не по экспоненциальному, а по логарифмическому закону. Однако у Opus, похоже, проявились некоторые недостатки стерео-кодирования, впрочем это лишь догадки.
Ну и по-настоящему впечатляющие результаты показал QuickTime AAC: он явно работает в исключительно адаптивном режиме, не подмешивая (по крайней мере, без надобности) к сигналу никаких шумов, и вообще не внося в него даже по прохождении 100 проходов никаких существенных изменений.
Как бы там ни было, о чем-то результаты проведенного сегодня теста всё же говорят. Для более точных выводов следует обратиться к экспертам, имеющим дело непосредственно с написанием алгоритмов кодирования, что я и постараюсь сделать в ближайшее время.
Информация от спонсора
Инжпласт: инженерные сети. Строительство наружных инженерных коммуникаций, строительные материалы. На странице https://ingplast.ru/tekhnicheskie-truby-pnd/ Вы можете ознакомиться с ассортиментом полиэтиленовых технических труб ПНД.
if NOT "%1" == "" ( flac -d "%1" --stdout --silent|lossywav - --stdout -q 7.8 --stdinname "%1"|flac --ignore-chunk-sizes - -b 512 -8 -o "%~dpn1.lossy.flac" && metaflac.exe --export-tags-to=%1.xml "%1" && metaflac.exe --import-tags-from=%1.xml "%~dpn1.lossy.flac"
del "%1"
del "%1.xml"
exit/b
)ELSE (
for %%i in (*.flac) do call %0 %%i)
)
track gain +39.72 dB по приведенной в статье методике - ни один из lossy кодеков на самых высоких настройках не дал даже близкого результата. (OGG q 10 +31.14 dB).Звук абсолютно прозрачен. Размер файлов сопоставим. Вывод: чистые lossy кодеки отживают свое время (относится ко всем, а не только к mp3).
/в папке с bat-ником:flac.exe, lossyWAV.exe, metaflac.exe, libfftw3-3.dll./ имя *.flac файла не должно содержать пробелов, запятых, и скобок().
Деградирование аудио на 28 проходе нет track gain +38.05 dB.