Pull to refresh

Экстремальное кодирование аудио

Sound
Sound RecorderВы никогда не задумывались, как поведут себя существующие форматы сжатия с потерями в совершенно ненормальных условиях? Обычно они удачно маскируют удаляемую информацию, и ухо неискушенного пользователя не слышит разницы. А может быть это недостаток акустики сегодня, и после её обновления завтра всё всплывёт наружу?

В интернете можно найти массу информации о слепых тестированиях различных форматов и сравнении спектрограмм. Уже давно сделана масса выводов о том, какое качество предпочтительней. Но основная рекомендация остается одна — опираться на свои уши. И тут может оказаться, что кому-то и MP3 128kbps сойдет за CD-качество — скорее всего, купить неплохую акустику еще предстоит, а может и медведь на ухо наступил. Как быть?

Предлагаю провести совершенно ненормальный, но тем не менее наглядный эксперимент. Чтобы услышать разницу, мы будем кодировать звук не один, а 5, 10 или 50 раз!

При каждом повторном кодировании кодировщик будет удалять всё новую и новую информацию, которую на его взгляд человеческое ухо не услышит. Наша задача — выявить минимальный битрейт популярных форматов сжатия с потерями (MP3 и Ogg Vorbis), который и при 100 итерациях перекодирования сохранит звук практически неотличимым от оригинала.

Подготовка


Для кодирования MP3 будем использовать последнюю стабильную версию LAME (3.98.4). Чтобы автоматизировать процесс повторного кодирования сделаем небольшой bat файл. Схема работы проста: кодируем wav файл в mp3, затем декодируем обратно в wav, затем кодируем уже полученный wav и т.д.
@copy /Y %1 ~temp.wav
@for /L %%i in (1,1,%3) do @(
    @echo -------------------------------------------------------------------------------
    @echo -- Iteration %%i
    @echo -------------------------------------------------------------------------------
    lame %4 ~temp.wav ~temp.mp3
    lame --decode ~temp.mp3 ~temp.wav
)
@copy /Y ~temp.mp3 %2
@del ~temp.wav
@del ~temp.mp3
Назовем его mp3_xcode.bat. Формат запуска выглядит так:
mp3_xcode <input.wav> <output.mp3> <iterations> "<lame params>"

Для Ogg Vorbis воспользуемся OggEnc aoTuV b5.7. Сделаем bat файл для этого формата.
@copy /Y %1 ~temp.wav
@for /L %%i in (1,1,%3) do @(
    @echo -------------------------------------------------------------------------------
    @echo -- Iteration %%i
    @echo -------------------------------------------------------------------------------
    oggenc %4 -o ~temp.ogg ~temp.wav
    oggdec -w ~temp.wav ~temp.ogg
)
@copy /Y ~temp.ogg %2
@del ~temp.wav
@del ~temp.ogg
Назовем его ogg_xcode.bat. Формат запуска выглядит так:
ogg_xcode <input.wav> <output.ogg> <iterations> "<oggenc params>"

Если вы захотите самостоятельно поэкспериментировать, вам пригодится архив sndexp.7z (1,3Мб), в который включены все необходимые файлы.

На старт, внимание, марш!


Ниже вы увидите множество ссылок на аудио-файлы. Рекомендую воспользоваться плеером, который может воспроизводить файлы напрямую по http ссылке (например, foobar2000).
В качестве исходной композиции во всех случаях использовался насыщенный отрывок из композиции «O Fortuna» в исполнении Therion. Скачать его можно здесь: fortuna.flac (2,8Мб) или fortuna.ogg (466Кб).
Итак, приступим.

Первый рубеж: ~128kbps

Будем кодировать в VBR, поэтому подберем параметры, выдающие в среднем 128kbps.
mp3_xcode fortuna.wav fortuna_128x10.mp3 10 "-V 6"
ogg_xcode fortuna.wav fortuna_128x10.ogg 10 "-q4"
Получаем файлы:
x10 fortuna_128x10.mp3 (340Кб) fortuna_128x10.ogg (360Кб)
x50 fortuna_128x50.mp3 (326Кб) fortuna_128x50.ogg (367Кб)
На этих примерах отчетливо видно, что у MP3 и Ogg Vorbis совершенно разный подход к кодированию. После каждого повторного кодирования звук в MP3 становится все больше похож на белый шум. У Ogg Vorbis эффект совсем другой — звук становится более глухим.
Во всех случаях мы получили отвратительный результат.

Поднимаем планку: ~192kbps

Подберем параметры, которые дают приблизительно 192kbps.
mp3_xcode fortuna.wav fortuna_192x10.mp3 10 "-V 2"
ogg_xcode fortuna.wav fortuna_192x10.ogg 10 "-q6"
Получаем файлы:
x10 fortuna_192x10.mp3 (533Кб) fortuna_192x10.ogg (528Кб)
x50 fortuna_192x50.mp3 (531Кб) fortuna_192x50.ogg (552Кб)
В этом тесте при 10 перекодированиях Ogg Vorbis показал себя значительно лучше, чем MP3. Его уже можно заставить себя слушать, но отчетливо чувствуется огромное количество артефактов. При 50 слушать уже невозможно. Вердикт — тест провален.

Еще выше: ~256kbps

Подберем параметры, которые дают приблизительно 256kbps.
mp3_xcode fortuna.wav fortuna_256x10.mp3 10 "-V 0"
ogg_xcode fortuna.wav fortuna_256x10.ogg 10 "-q7,3"
Получаем файлы:
x10 fortuna_256x10.mp3 (624Кб) fortuna_256x10.ogg (624Кб)
x50 fortuna_256x50.mp3 (624Кб) fortuna_256x50.ogg (747Кб)
x99 fortuna_256x99.mp3 (624Кб) fortuna_256x99.ogg (849Кб)
Здесь при 10 итерациях кодирования оба формата дали примерно одинаковый результат. Однако, уже при 50 старичок MP3 уже начинает ощутимо выигрывать у Ogg Vorbis. Причем у последнего в результате получился более высокий битрейт! Для того, чтобы проверить тенденцию, количество итераций было увеличено до 99. Тенденция сохранилась: MP3 остался все еще относительно слушабельным, и Ogg Vorbis значительно уступает ему в этом.

И напоследок: ~320kbps

Поскольку в LAME параметр -V нельзя задать ниже 0, мы воспользуемся параметром -b 320. Для OggEnc сделаем то же самое. При этом Ogg Vorbis будет работать в режиме VBR, а MP3 в режиме CBR.
mp3_xcode fortuna.wav fortuna_320x10.mp3 10 "-b 320"
ogg_xcode fortuna.wav fortuna_320x10.ogg 10 "-b 320"
Получаем файлы:
x10 fortuna_320x10.mp3 (862Кб) fortuna_320x10.ogg (888Кб)
x50 fortuna_320x50.mp3 (862Кб) fortuna_320x50.ogg (1099Кб)
После 10 итераций кодирования у обоих форматов получился неплохой результат. Это можно слушать, причем MP3 сложно отличить от оригинала. При 50 итерациях — в обоих форматах отчетливо слышны неприятные артефакты, и Ogg Vorbis несколько проигрывает MP3, не глядя на то, что с каждым повторным кодированием он автоматически повышал битрейт.

Вердикт

  • Ogg Vorbis лучше MP3 на битрейтах до 256kbps
  • MP3 лучше Ogg Vorbis на битрейтах от 256kbps до 320kbps
  • Кодер Ogg Vorbis с трудом переваривает ранее собой же закодированные данные, поэтому увеличивает битрейт
  • Тестируемые кодеры обоих форматов при многократном перекодировании не смогли обеспечить прозрачное звучание на всех проверенных битрейтах

Выводы


В свете некоторой абсурдности всего эксперимента прошу не относиться к написанному слишком серьезно. Все это может стать лишь одним из поводов задуматься о хранении домашней колекции музыки lossless форматах наподобие FLAC. Пожалуй, это единственный разумный вывод, который можно было бы вынести из написанного.

P.S. Кандидат на звание псевдо-lossless


В 2002 году для кодирования Ogg Vorbis был популярен кодер OggEnc GT3 (176Кб). При кодировании на максимальном качестве он выдает битрейт в среднем более 500kbps. Чуть позже я попробовал воспользоваться им для нашего эксперимента, в результате чего был удивлен: даже после тысячи перекодирований кажется я не могу отличить полученный файл fortuna_q10x1000.ogg (1421Кб) от оригинала. Да и средний битрейт получаемого файла практически не изменялся после каждой итерации. Последняя официальная версия кодера Ogg Vorbis и популярная версия aoTuV даже при 100 перекодированиях давали плохой результат. Так что старый GT3 при максимальном качестве кодирует лучше всего. Однако, на других битрейтах GT3 не показал себя так же хорошо.
Tags:
Hubs:
Total votes 109: ↑82 and ↓27 +55
Views 8.8K
Comments Comments 92