Делим FLAC на треки в Linux с помощью ffcuesplit

Jazz

Опубликован:
2025-01-12T03:22:19.062066Z
Отредактирован:
2025-01-12T03:22:19.062066Z
Статус:
публичный
14
0
0

Поделить цельный CDDA-рип на отдельные треки под управлением операционной системы с Linux можно несколькими различными способами. В этом обзоре я покажу элементарные приёмы работы с утилитой командной строки ffcuesplit, она без труда справляется с задачей, при этом полученные в результате её работы треки будут иметь уже заполненные в соответствии с cuesheet рипа метаданные, и им можно уже в процессе деления дать соответствующие cuesheet рипа имена.

О программе

ffcuesplit — утилита командной строки для деления цельных CDDA-рипов на треки, при этом с помощью этой программы можно получать треки различных форматов: mp3, ogg, opus, m4a, flac. Метаданные треков ffcuesplit заполняет автоматически в процессе деления, получая при этом данные из файла .cue.

ffcuesplit разработана мной с помощью современного языка программирования Python, распространяется свободно в исходных кодах и может быть использована всеми желающими в соответствии с условиями GNU GPLv3. Скачать исходный код программы можно в моём профиле на github.com по этой короткой ссылке.

Принцип работы ffcuesplit достаточно прост. Программа читает и анализирует хранящиеся в cuesheet рипа данные, отбирает для каждого определённого в файле .cue трека метаданные и индексы разметки, а затем в соответствии с полученными данными формирует для каждого трека две команды. Первая команда использует программу ffmpeg и её встроенные декодеры, с помощью соответствующего формату медиа файла рипа декодирует хранящийся в нём PCM-поток и отдаёт его на свой stdout. Вторая команда использует указанный пользователем энкодер и, получая PCM-поток на своём stdin, сжимает его в соответствующий указанному энкодеру формат. Обе команды в рамках ffcuesplit исполняются с помощью subpocess — модуля стандартной библиотеки Python, и связаны в процессе исполнения программным каналом. Единственное условие для правильной работы ffcuesplit — в операционной системе должны быть установлены ffmpeg и энкодер, с помощью которого пользователь намерен сжимать исходный PCM-поток.

Установка ffcuesplit

Поскольку работа программы основана на декодерах ffmpeg и свободных энкодерах популярных ныне audio форматов, всё это великолепие перед использованием ffcuesplit необходимо установить в операционную систему. Список зависимостей следующий:

  • ffmpeg;

  • lame;

  • vorbis-tools;

  • opus-tools;

  • faac;

  • python3-chardet.

В рамках этого обзора я буду использовать ffcuesplit под управлением операционной системы Debian sid, в ней все зависимости можно установить вот такой простой командой:

$ sudo apt install ffmpeg lame vorbis-tools opus-tools faac python3-chardet

Для установки ffcuesplit мне потребуется только терминал и соединение с сетью Интернет, поскольку исходный код программы хранится на github.com. Устанавливать ffcuesplit можно в любой каталог файловой системы, в том числе в домашний каталог текущего пользователя. Но обычно сторонние программы принято устанавливать в системный каталог /opt, поэтому в терминале вхожу в этот системный каталог.

$ cd /opt

Так как код ffcuesplit хранится только на github.com, перед установкой программы стоит поставить в операционную систему ещё и Git.

$ sudo apt install git

Работа в системном каталоге /opt требует прав суперпользователя. Скопировать исходный код ffcuesplit из Git можно следующей командой.

$ sudo git clone https://github.com/jazz4web/ffcuesplit.git

sK90Z3Dlbf.png

Как видно на снимке экрана, в результате исполненной команды в системном каталоге /opt появился вложенный каталог с именем ffcuesplit. Чтобы запуск программы был удобным и лаконичным, достаточно положить символическую ссылку на исполняемый модуль ffcuesplit в системный каталог /usr/local/bin.

$ sudo ln -s -T /opt/ffcuesplit/ffcuesplit.py /usr/local/bin/ffcuesplit

И всё... Программа готова к использованию.

CYJ18ZphwO.png

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

Делим цельный CDDA-рип на треки

В моём распоряжении есть цельный CDDA-рип в формате FLAC — в самом общем случае это два файла с совпадающими до знака именами, различающимися только расширением (.cue и .flac). Чтобы поделить этот образ на треки, достаточно указать программе имя любого из этих двух файлов следующей простой командой.

$ ffcuesplit image.cue

Или...

$ ffcuesplit image.flac

FKILAdxBDg.png

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

MmOQtwXOB9.png

Управление зазорами

Как известно, cuesheet цельного CDDA-рипа имеет в своём содержимом не только метаданные образа, но ещё и индексную разметку треков. Индексная разметка предполагает специальные поля с именами INDEX 00 и INDEX 01, при этом INDEX 01 является обязательным для всех треков образа. Оба индекса содержат в себе обычную строку вида min:sec:frame, выражающую соответствующий таймкод. Расстояние между этими таймкодами определяют длительность зазоров между треками и длительность каждого трека.

Считается, что если один или более треков в cuesheet образа имеют оба индекса, то в образе определены зазоры, которые можно, в случае необходимости, обрезать. ffcuesplit управляет зазорами при помощи ключа -g. Этот ключ может принимать значения append, prepend и split. Если в команде ключ -g не задан, он принимает значение по-умолчанию — split. Таким образом, используя ключ -g можно управлять распределением зазоров.

Зазоры можно распределить в конец трека:

$ ffcuesplit -g append image.cue

Зазоры можно распределить в начало трека:

$ ffcuesplit -g prepend image.cue

Зазоры можно обрезать:

$ ffcuesplit image.cue

Именование файлов треков

Созданные файлы треков имеют соответствующие номеру трека имена. ffcuesplit умеет именовать треки по схеме num - artist - title, за эту функцию отвечает ключ -r.

$ ffcuesplit -r image.flac

uoKd6wT7uW.png

А что, кроме FLAC?

ffcuesplit умеет делить цельные CDDA-рипы в форматах FLAC, WavPack и Monkey's Audio, при этом образы первых двух форматов программа делит корректно, придерживаясь сэмплов исходного PCM-потока. Образы Monkey's Audio по сэмплам делить не получается по причине некорректной работы алгоритмов ffmpeg с его декодером.

ffcuesplit умеет получать файлы треков в форматах mp3, opus, ogg и m4a. О некоторых мелких деталях в работе программы с этими энкодерами я расскажу дополнительно в отдельном для каждого формата обзоре.