Вы когда-нибудь сталкивались с ситуацией, когда после добавления глав в аудиофайл пропадали обложки, авторские теги или комментарии? Проблема знакома многим, кто работает с мультиформатными аудиобиблиотеками. Сегодня разберём, как обойти “агрессивное” поведение FFmpeg и научимся редактировать главы, не трогая остальные метаданные.
Простой способ для конкретных форматов
Если вам нужно быстро добавить разделы в один-два файла, есть инструменты под конкретные форматы. Для MP3 – mp3chap, для FLAC/Opus – vorbiscomment. Но здесь есть нюанс: эти утилиты требуют ручной подготовки данных.
Пример для MP3 через mp3chap:
mp3chap -c "00:00:00 Вступление" -c "00:02:30 Основная часть" audio.mp3
Кстати, время вводится в формате ЧЧ:ММ:СС. Если ошибётесь с синтаксисом – получите молчаливый отказ без подсказок (проверено на горьком опыте).
Для форматов Apple (M4A/M4B) всё сложнее – здесь без FFmpeg не обойтись. Но есть лайфхак: используйте Kid3 с плагином MP4v2. В настройках программы активируйте опцию “MP4v2”, затем через GUI импортируйте главы из текстового файла. Работает, но для пакетной обработки неудобно.
Важно: При использовании vorbiscomment для Ogg/FLAC сохраняйте кодировку UTF-8. Иначе вместо кириллицы получите кракозябры.
Универсальное решение для любого формата
Когда нужно обработать десятки файлов разных типов, пригодится связка FFmpeg + Kid3. Суть метода: сначала добавляем главы через FFmpeg (что сбросит часть метаданных), затем восстанавливаем оригинальные теги через Kid3.
1. Подготовка файла глав
Создайте ffmetadata.txt в формате:
;FFMETADATA1 [CHAPTER] TIMEBASE=1/1000 START=0 END=150000 title=Вступление [CHAPTER] START=150000 END=300000 title=Интервью
Здесь TIMEBASE определяет единицы измерения (1/1000 = миллисекунды). Если вместо этого использовать 1/1 — время будет в секундах.
2. Обработка через FFmpeg
ffmpeg -i original.m4a -i ffmetadata.txt -map 0:a -map_metadata 1 -map_chapters 1 -c copy temp.m4a
Параметры:
- -map 0:a – берём только аудиодорожку (чтобы избежать ошибок с видеостримами)
- -map_metadata 1 – импорт метаданных из второго файла
- -c copy – без перекодирования
3. Восстановление тегов через Kid3
kid3-cli -c "timeout off" -c "select 'original.m4a'" -c "copy" -c "select 'temp.m4a'" -c "paste" -c "save"
После этого заменяем временный файл на оригинальный:
mv -f temp.m4a original.m4a
Ловушка: Если в исходном файле уже есть главы, они продублируются. Чтобы очистить старые разделы, используйте QML-скрипт DeselectChapterTags.qml перед копированием метаданных.
Тонкости, о которых молчат мануалы
- Movflags для MP4: Добавьте -movflags disable_chpl в команду FFmpeg, чтобы отключить дублирование глав в формате Nero. Некоторые плееры (особенно старые) не понимают двойную разметку.
- Кодировка времени: В FFmetadata.txt нельзя использовать 00:02:30 – только миллисекунды или целые секунды.
- Порядок аргументов: Если поставить -map_chapters перед -map_metadata, FFmpeg проигнорирует названия глав для MP4.
- Проверка результата: Для быстрого просмотра метаданных используйте
ffprobe -hide_banner -show_chapters -print_format json audio.m4a
Случай из практики: при переносе глав из Audacity Labels через Python-скрипт иногда сбивается нумерация. Всегда проверяйте первый и последний временные метки через ffprobe. Одна пропущенная запятая в JSON может сместить все главы на 10 секунд вперёд.
Если всё сделано правильно, вы получите файл с новыми разделами и сохранёнными тегами. Метод работает даже для экзотических форматов вроде Opus или AIFF – главное, чтобы Kid3 поддерживал запись метаданных. Для автоматизации можно обернуть команды в bash-скрипт с циклом по файлам, добавив проверку на существование временного файла (чтобы случайно не перезаписать данные).