FLAC против MP3: что кодировщик выбрасывает из трека и слышно ли это

Спор «FLAC или MP3» обычно идёт на словах: один слышит «воздух», другой не слышит ничего. Я взял один трек, сжал его шестью способами и измерил, что изменилось в файле.
MP3 128 кбит/с обрезал всё выше 16,5 кГц, MP3 320 дошёл до 20,1 кГц. После десяти пересохранений MP3 128 потерял больше 10 дБ. FLAC после повторного сжатия совпал с оригиналом до бита. Под катом пять замеров с графиками, расчёт для слепого теста и таблица, какой формат для чего брать.
Что сравниваю
Трек: COOL&CREATE, «Help me, ERINNNNNN!!», издание 2024 года. Это аранжировка музыки из Touhou: быстрая электроника с вокалом, плотная и громкая. Длина 5 минут 16 секунд, 44,1 кГц, 16 бит, стерео. Это параметры обычного компакт-диска.
Кодировщик MP3: LAME 3.100, настройки по умолчанию.
ffmpeg -i track.flac -c:a pcm_s16le orig.wav # несжатый звук
lame -b 128 orig.wav cbr128.mp3 # постоянные 128 кбит/с
lame -b 320 orig.wav cbr320.mp3 # постоянные 320 кбит/с
lame -V2 orig.wav v2.mp3 # переменный битрейт
lame -V0 orig.wav v0.mp3 # переменный, выше качество
-V0 и -V2 задают качество, а битрейт кодировщик подбирает сам для каждого отрезка. Вики Hydrogenaudio даёт для них средние 245 и 190 кбит/с. На моём треке вышло 261 и 184.
Замер 1. Размер

Формат | Размер | Средний битрейт | Доля от WAV |
|---|---|---|---|
WAV | 55,7 МБ | 1411 кбит/с | 100% |
FLAC | 43,0 МБ | 1090 кбит/с | 77% |
MP3 320 | 12,6 МБ | 320 кбит/с | 23% |
MP3 V0 | 10,3 МБ | 261 кбит/с | 19% |
MP3 V2 | 7,3 МБ | 184 кбит/с | 13% |
MP3 128 | 5,1 МБ | 128 кбит/с | 9% |
FLAC сжал трек на четверть, MP3 320 в четыре с лишним раза. На тысячу таких треков FLAC займёт около 43 ГБ, MP3 320 около 13 ГБ, MP3 128 около 5 ГБ. Степень сжатия FLAC зависит от музыки. Здесь плотная громкая электроника, и она сжалась слабо: тихая акустика обычно сжимается сильнее.
FLAC при этом ничего не теряет. Я проверил это контрольной суммой распакованного звука:
ffmpeg -i track.flac -f s16le - | md5sum # 511b1390...
ffmpeg -i orig.wav -f s16le - | md5sum # 511b1390...
ffmpeg -i again.flac -f s16le - | md5sum # 511b1390...Третья строка: WAV, заново сжатый во FLAC. Все три суммы совпали, то есть звук совпадает до бита. FLAC работает как архиватор: предсказывает следующий отсчёт по предыдущим и хранит только ошибку предсказания.
Замер 2. Где обрывается верх
MP3 устроен иначе. Он делит звук на кадры по 1152 отсчёта, переводит каждый в спектр и решает, какие частоты записать точно, какие грубо, а какие выбросить. Первым под нож идёт самый верх спектра. На спектрограмме это видно как чёрная полоса сверху: слева оригинал, дальше MP3 320 и MP3 128.

То же самое одним графиком, усреднённо по всему треку:

Чёрная линия FLAC доходит до 22 кГц, это предел для частоты дискретизации 44,1 кГц. Остальные линии в какой-то момент падают вниз:
Формат | Спектр обрывается на |
|---|---|
MP3 64 | 10,9 кГц |
MP3 128 | 16,5 кГц |
MP3 V2 и MP3 192 | 18,7 кГц |
MP3 320 | 20,1 кГц |
MP3 V0 | обрыва нет, линия идёт рядом с FLAC |
Линия MP3 V0 идёт вплотную к FLAC, потому что на этой настройке LAME фильтр верхних частот выключает. Кодировщик сам об этом пишет, если запустить его с ключом --verbose:
-V0 polyphase lowpass filter disabled
-b 320 Using polyphase lowpass filter, transition band: 20094 Hz - 20627 Hz
-V2 Using polyphase lowpass filter, transition band: 18671 Hz - 19205 Hz
-b 128 Using polyphase lowpass filter, transition band: 16538 Hz - 17071 HzИз этого не следует, что V0 равен FLAC. График показывает, сколько энергии в среднем на каждой частоте. Насколько точно эти частоты записаны, по нему не видно. V0 оставляет верх спектра на месте и кодирует его грубо. Точность показывает следующий замер, и там V0 уступает MP3 320.
Слышен ли обрыв, зависит от слуха и от музыки. Верхняя граница слуха с возрастом опускается, и от 17 до 20 кГц в музыке мало энергии: на графике этот участок примерно на 50 дБ ниже пика спектра. Свою границу легко узнать: включите генератор тона и ведите частоту вверх, пока звук не пропадёт.
MP3 64 устроен ещё жёстче: LAME на этом битрейте сам понижает частоту дискретизации до 24 кГц, выше 12 кГц в таком файле звука нет совсем. Горб на 13 кГц, скорее всего, след обратного пересчёта в 44,1 кГц для графика: он зеркален спаду у 11 кГц относительно 12 кГц.
Замер 3. Разница с оригиналом
Обрыв верха показывает только часть потерь. Чтобы увидеть всё, я распаковал MP3 обратно в отсчёты и вычел их из оригинала. Осталось то, чем файлы отличаются.

Слева разница для MP3 320, справа для MP3 128, отрывок тот же, что на спектрограмме выше. Яркость показывает громкость. У MP3 128 разница идёт по всему спектру, а сильнее всего она ниже 5 кГц, где звучит сама музыка.
В цифрах: насколько разница тише самого трека.
Формат | Разница тише трека на |
|---|---|
MP3 128 | 16,7 дБ |
MP3 V2 | 20,2 дБ |
MP3 V0 | 25,9 дБ |
MP3 320 | 30,2 дБ |
30,2 дБ мало. Шум на таком уровне, включённый отдельно, слышит любой. В MP3 его обычно не слышно, потому что кодировщик прячет ошибку рядом с громкими звуками. Ухо плохо различает тихий звук, если на близкой частоте в тот же момент звучит громкий. Это свойство называется маскировкой, и на нём построен весь формат: модель слуха в кодировщике считает, сколько ошибки поместится под каждым громким звуком, и тратит биты там, где спрятать её негде.
Поэтому число из таблицы нельзя читать как «слышимость». Оно говорит, сколько звука изменилось, и молчит о том, заметит ли это человек.
Замер 4. Повторное сжатие
Маскировка рассчитана на один проход. Если распаковать MP3 и сжать снова, кодировщик заново решает, что выбросить, и ошибки складываются. Я прогнал трек через LAME десять раз подряд.

Сколько раз сжали | MP3 320 | MP3 128 |
|---|---|---|
1 | 30,2 дБ | 16,7 дБ |
5 | 25,8 дБ | 9,9 дБ |
10 | 23,9 дБ | 6,4 дБ |
MP3 320 за десять проходов потерял 6,3 дБ, MP3 128 потерял 10,3 дБ. В жизни это выглядит так: трек скачали в MP3, обрезали в редакторе и сохранили, залили на сервис, сервис сжал его ещё раз. С FLAC такого не случается: его можно распаковывать и сжимать сколько угодно, сумма из первого замера останется той же.
Отсюда главный довод за FLAC. Он нужен как исходник, из которого в любой момент получается MP3, Opus или формат, которого пока нет. Обратного пути у сжатого файла нет.
Замер 5. FLAC, в котором нет верха
Расширение .flac говорит только о том, что файл сжат без потерь. Что лежало на входе кодировщика, оно не говорит. Мне попался такой файл на Wikimedia Commons, когда я искал трек для статьи:

У обоих файлов одинаковые параметры: 44,1 кГц, 16 бит. У «Help me, ERINNNNNN!!» спектр доходит до 22 кГц. У второго файла он обрывается на 15,3 кГц ступенькой, как у MP3 на графике из второго замера.
По самому файлу не узнать, откуда обрыв. Так выглядит MP3, пересохранённый во FLAC, и так же может выглядеть запись, которую отфильтровали при сведении. Но если вы платите за FLAC или качаете его ради качества, спектр стоит проверить. Спектрограмму показывают Audacity и Spek, а одной командой её строит ffmpeg:
ffmpeg -i track.flac -lavfi showspectrumpic=s=1200x600 spectrum.pngПерекодировать MP3 во FLAC бессмысленно: файл вырастет в несколько раз, а выброшенное не вернётся.
Слышно ли это
Замеры показывают, что файлы разные. Слышит ли это человек, проверяют только слепым тестом: слушатель не знает, какой файл играет, и выбирает на слух.
В 2009 году на конвенции Audio Engineering Society показали такую работу: Pras, Zimmerman, Levitin и Guastavino, «Subjective Evaluation of MP3 Compression for Different Musical Genres». Тринадцать подготовленных слушателей, музыканты и звукорежиссёры, сравнивали CD-качество с MP3 от 96 до 320 кбит/с. По аннотации работы, они значимо предпочитали CD файлам MP3 с битрейтом до 192 кбит/с. Про 256 и 320 кбит/с такого вывода в аннотации нет.
Вики Hydrogenaudio пишет то же другими словами: в слепых тестах LAME обычно становится неотличим от оригинала на битрейтах заметно ниже максимального.
Чужие уши ничего не говорят о ваших, поэтому проще проверить самому. Нужна программа, которая играет два файла под нейтральными названиями и переключает их без паузы: плагин ABX для foobar2000 на компьютере или сравнение версий трека в Nami на телефоне. Сколько верных ответов нужно, чтобы результат не был везением, считается по формуле для подбрасывания монеты:
Попыток | Верных ответов | Шанс угадать столько случайно |
|---|---|---|
10 | 8 и больше | 5,5% |
10 | 9 и больше | 1,1% |
16 | 12 и больше | 3,8% |
16 | 13 и больше | 1,1% |
Восемь из десяти ещё похоже на удачу. Девять из десяти или тринадцать из шестнадцати уже говорят, что разницу вы слышите.
Два условия, без которых тест ничего не покажет:
Громкость файлов должна совпадать. Более громкий вариант обычно кажется лучше.
Наушники должны быть проводными. Bluetooth сам сжимает звук с потерями: SBC, AAC, aptX и LDAC все относятся к таким кодекам. FLAC по дороге к беспроводным наушникам перекодируется так же, как MP3.
Что из этого следует
Задача | Формат | Почему |
|---|---|---|
Домашняя библиотека, архив | FLAC | Исходник без потерь: из него получается любой формат, повторное сжатие ему не вредит |
Телефон с небольшой памятью | MP3 V0 или 320 | В 3 или 4 раза меньше FLAC. В работе 2009 года слушатели предпочитали CD только файлам до 192 кбит/с |
Мобильный интернет | от 128 до 192 кбит/с | Экономит трафик, потери уже можно услышать |
Трек, который будут резать и пересохранять | FLAC | У MP3 128 десять пересохранений съели больше 10 дБ |
В Nami это устроено так: сервер хранит файлы в исходном формате, а в экономном качестве сжимает их на лету в Opus 128 кбит/с и отдаёт телефону.
Ограничения замеров
Трек один, и скачать его бесплатно нельзя: это файл из моей коллекции. Скрипт работает на любом вашем файле. На другой музыке цифры сдвинутся: кастаньеты и клавесин для MP3 труднее, чем плотный рок.
Кодировщик один, LAME 3.100. Старые кодировщики на том же битрейте работают хуже.
Разница в децибелах не равна слышимости, об этом сказано в третьем замере. На слух её проверяет только слепой тест.
Opus и AAC я не сравнивал. Они новее и на низких битрейтах сжимают лучше MP3. Fraunhofer закрыл программу лицензирования MP3 23 апреля 2017 года и сам назвал AAC более эффективным кодеком.
FLAC 24 бита и 96 кГц я тоже не трогал: это отдельный спор.
Попробовать
Сайт: nami-music.ru
Android (8.0 и новее): скачать APK
Windows и Linux: скачать для компьютера
Сервер: инструкция по установке, ставится одной командой
Nami бесплатный, без рекламы и аккаунтов. Про проект целиком я рассказывал в первой статье.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.