Здарова, народ! Рад представить вашему вниманию расшифровку первого выпуска подкаста GoLang Awesome. Поэтому расскажу немного про него.

GoLang Awesome – это подкаст, в котором я беру за основу какую-либо технологию, углубленно её ресёрчу (за кадром), а потом в краткой и понятной форме рассказываю. И самое главное – каждый выпуск сопровождается ссылкой на библиотеку для Go, с помощью которой можно работать с технологией выпуска.

Героем первого выпуска станет аудио-кодек FLAC.

FLAC – это свободный кодек для сжатия аудио данных без потерь. Переводится аббревиатура точно также: Free Losslesss Audio Codec. Запись, сжатая кодеком FLAC, может быть распакована в полностью оригинальную запись. Но при этом она будет на 50-60% весить меньше, чем в формате WAV, в котором обычно хранят совсем несжатый звук.

Давайте немного глубже погрузимся в тему аудио кодеков. Как вы поняли на примере FLAC, существуют кодеки сжатия без потерь. А значит существуют и кодеки сжатия с потерями. И самый известный из тех, что с потерями: mp3. И как же mp3 сжимает звук? И почему он делает это с потерями, а FLAC может без потерь?

Сжатие в MP3

Говоря простым языком, кодек MP3 обрезает те части звука, которые среднестатистический человек на повседневном девайсе не услышит. Но повторюсь: среднестатистический на повседневном девайсе, вроде ноутбука или смартфона. Если же сравнить несжатый звук и MP3 на профессиональном оборудовании, то разница будет заметна. Так, как этот кодек вообще понимает, какие звуки можно вырезать?

Тут в дело вступает такая наука, как – психоакустика. Это наука, которая изучает как мы воспринимаем звук. Наверняка вы слышали факт, что человек слышит в диапазоне от 16 Гц до 20 кГц. Соответственно, мы можем смело вырезать весь звук за пределами этого диапазона. Но вот какая ещё есть особенность с ним: большинство взрослых людей не могут слышать звук частотой выше 16 кГц. Следовательно диапазон сужается ещё больше!

Вдобавок к этому можно вспомнить про эффект маскировки, когда более громкий звук заглушает более тихий. Сюда же можно добавить и тот факт, что порог слышимости зависит также от частоты звука.

Совокупность фактов, о которых рассказывает психоакустика (и ещё некоторые хитрости) и позволяют формату MP3 так смело вырезать лишнее из звука.

Сжатие во FLAC

Как же так получается, что формату FLAC удаётся сжимать звук, пусть и значительно меньше, чем MP3, но совсем без потерь?

С помощью математики и кучки формул. Например, совсем необязательно в стерео звуке дублировать оба канала в файле. Можно вычислить среднее между правым и левым каналом, и “рядом” записать ещё их разность. Таким образом, при воспроизведении мы сможем обратно посчитать данные для каждого из каналов, а самое главное это будет значительно эффективнее, чем хранение двух потоков. Если что, такая операция будет называться межканальной декорреляцией.

И “межканальная декорреляция” хоть и звучит сложно, но на деле это лишь верхушка айсберга этого кодека!

Сразу после неё идёт процесс моделирования, во время которого кодировщик пытается найти такую математическую функцию, с помощью которой он сможет более эффективно закодировать звуковую волну с использованием меньшего количества бит. Это несколько упрощённое описание, чтобы у нас у всех тут не вскипел мозг.

А затем происходит кодирование подобранной математической модели в аудиофрейм с некоторыми служебными данными, вроде кода синхронизации, контрольной суммы и так далее.

Как работать с FLAC на Go?

С помощью библиотеки FLAC!

Эта библиотека позволит вам потоково читать как мета-данные, так и аудио-данные, которые во flac формате хранятся в виде кадров. В репозитории вы найдёте примеры конвертеров в WAV и из WAV.

У библиотеки 228 звёздочек, последний коммит был 3 октября, но в среднем в году их буквально 3-4. Последнее обновление, связанное с кодировкой, было аж 2 года назад. Хотя, каких-то значимых изменений в спецификации я не нашёл и в оригинальной libflac.

И на этом всё! Не забывайте, что вы всегда можете послушать версию без видеоряда в Telegram канале.