Кодируем opus в Linux

debianeach

Опубликован:  2019-03-24T13:44:14.908306Z

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

opus - современный формат хранения аудио-данных, приобрёл популярность за счёт наилучшего соотношения степени сжатия и качества воспроизведения аудио-данных, по результатам слепого тестирования показал великолепные результаты в сравнении с кодеками Apple HE-AAC, Nero HE-AAC, Vorbis и AAC LC уже на битрейте 64 кбит/с, opus является открытым форматом и распространяется под лицензией BSD.

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

В Debian buster для работы с форматом opus имеется специализированный пакет - opus-tools, который можно установить с помощью apt из официального репозитория.

sudo apt install opus-tools

В составе этого пакета имеется консольная утилита opusenc, которая и даёт возможность кодировать аудио-данные в формат opus. Чтобы получить opus-файл, понадобится исходный файл, на входе opusenc принимает файлы WAV, AIFF, FLAC, Ogg/FLAC, или сырой PCM поток. В рамках этого обзора я буду кодировать WAV-файл, параметры которого можно посмотреть при помощи программы mediainfo, в одном из предыдущих выпусков блога, где я показывал кодирование mp3-файлов, этот же файл я кодировал в mp3 с помощью lame.

CjFQ1dDWf5.png

На снимке экрана выше показан выхлоп mediainfo для моего исходного файла, следует обратить внимание на характерные параметры:

  • Sampling rate 44.1 kHz;
  • Bit depth 16 bits;
  • Duration 3 min 31 s;
  • Stream size 35.6 MiB.

Исходный файл представляет из себя CDDA-рип - наиболее часто встречаемая и удобная форма распространения музыки в сети Интернет на сегодня.

В командной строке opusenc имеет следующую форму ввода команды:

opusenc [options] input_file output_file.opus

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

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

opusenc 05.wav 05.opus

yiX1aZdPGH.png

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

Ndk8CjwVNJ.png

Результирующие 3 MiB в сравнении с 36 MiB исходного файла выглядят впечатляюще. Следует заметить, всё же, что хоть и звучит opus практически неотличимо от исходника уже на дефолтном битрейте, однако декодированный из файла opus звуковой поток имеет существенные потери относительно исходного WAV-файла.

Поскольку opusenc на входе принимает формат FLAC, можно ожидать, что перекодирование очень распространённых на данный момент потрековых CDDA-рипов будет самой часто встречающейся задачей. Трудность заключается в том, что энкодер требует на входе как имя входящего файла, так и имя исходящего файла, поэтому пакетная обработка всех файлов каталога одной командой не представляется возможной, тем не менее задача очень просто решается автоматизацией процесса при помощи любого современного интерпретатора. Рассмотрим простой пример, у меня есть потрековый CDDA-рип, в консоли он выглядит следующим образом.

wE9bbkkiFg.png

Потрековый CDDA-рип - это, обычно, группа файлов в формате FLAC и текстовый CUE-файл с метаданными. Чтобы перекодировать этот рип одной командой в opus мне понадобится простой скрип, который я напишу на Python3. Находясь в текущем каталоге создаю файл encode.py при помощи текстового редактора nano.

nano encode.py

Помещаю в этот файл следующий код.

import glob
import os
import shlex

from subprocess import Popen

for file in sorted([name for name in glob.glob('*.flac')]):
    cmd = 'opusenc "{}" "{}"'.format(file, file.replace('.flac', '.opus'))
    with Popen(shlex.split(cmd)) as p:
        p.communicate()

rddflcWKFk.png

Сохраняю файл и выхожу из текстового редактора, это можно сделать с помощью клавиатурных сочетаний ctrl+o и ctrl+x. Теперь в каталоге с рипом появился ещё один файл.

igWjKzrjLM.png

Запускаю этот файл интерпретатором.

python3 encode.py

И наблюдаю кодирование всех фалов FLAC текущего каталога в формат opus.

5ofRrl86Si.png

Если посмотреть на полученные файлы более пристально, с помощью утилиты opusinfo, то можно увидеть, что все файлы имеют метаданные исходных файлов FLAC, убедимся на примере первого файла.

ZCW75UFn31.png

В результате я получил 10 файлов в формате opus с уже заполненными метаданными. Такой подход, впрочем, таит в себе один неприятный момент, если метаданные исходных файлов FLAC будут заполнены с кодировкой отличной от UTF-8, то opusenc не сможет их прочесть и завершит процесс ошибкой, поэтому стоит рассмотреть ещё один вариант пакетного кодирования всех файлов текущего каталога в формат opus - при помощи утилиты shntool.

shntool имеется в официальном репозитории Debian buster и может быть легко установлен при помощи пакетного менеджера apt, в составе пакета есть режим conv, его я и буду использовать.

shnconv -o 'cust ext=opus opusenc - %f' *.flac

5a6ox1MFyO.png

В этом случае полученные файлы opus не будут иметь метаданных, поэтому их придётся заполнять. Я обычно заполняю метаданные при помощи утилиты cue2tags из пакета cuetoolkit - по ссылке можно найти описание установки. С cue2tags метаданные целого альбома можно заполнить одной командой при условии, что есть CUE-файл, использовать можно CUE-файл исходного рипа.

cue2tags -m opus 7+1.cue

ikUQGQsJtQ.png

Кроме этого, можно воспользоваться оконными приложениями для заполнения метаданных - puddletag или kid3 - обе программы прекрасно поддерживают opus.

Xu7OE70RGz.png

otDOjIyNKz.png

Подведу небольшой итог: кодирование opus в Debian buster - задача элементарная, и решается она штатными средствами в терминале, при этом возможна пакетная обработка нескольких файлов одной командой.

Комментарии: