Как добавить главы в M4B через FFmpeg и проверить переходы
Файл ffmetadata с названиями и границами глав, команда для AAC/M4A, проверка M4B через ffprobe и контроль переходов в плеере.
Определите результат: один файл с навигацией
Главы внутри M4B помогают перейти к разделу длинной аудиозаписи, сохраняя её одним файлом. Это удобно для учебной лекции, записанной инструкции или собственной аудиокниги. Границы и названия являются метаданными: показанный процесс не разрезает звук на отдельные файлы.
Если нужны отметки в описании ролика, используйте порядок подготовки глав YouTube. У платформы свои правила. Здесь другая задача: подготовить главы внутри аудиоконтейнера и убедиться, что ими можно пользоваться в нужном приложении.
Инструкция рассчитана на уже установленный FFmpeg и подготовленный файл sample.m4a с аудиокодеком AAC. Проверьте версию командой ffmpeg -version. Не применяйте копирование потока к любому WAV или MP3 только потому, что выбрали расширение .m4b. Если кодек не подходит контейнеру, сначала отдельно подготовьте совместимую копию и проверьте её звук.
Оставьте оригинал отдельно, а результат назовите sample-with-chapters.m4b. Сразу решите, в каком плеере будете читать оглавление. Наличие глав в файле не гарантирует, что каждое устройство покажет одинаковый интерфейс навигации.
Найдите границы по окончательной версии аудио
До разметки закончите монтаж. Вырезанная пауза в середине сдвигает все последующие границы, поэтому список от исходника нельзя без проверки переносить на сокращённую запись. Запишите точное имя и версию файла, к которому относятся главы.
Для чернового оглавления удобно получить текст аудио в Транскрибаторе. Найдите смену вопросов или самостоятельных объяснений, затем прослушайте их начала в финальном файле. Текст подсказывает смысловую границу, а аудио подтверждает момент перехода.
Назовите раздел по тому, что в нём действительно объясняется. «Проверка результата» полезнее «Часть 2», если слушатель ищет проверку. Не делайте главу возле каждого предложения: оглавление должно позволять вернуться к законченной задаче.
ffprobe -v error -show_entries format=duration -of json "sample.m4a"
Уточните длительность и сравните её с последней границей. Для каждого интервала начало должно быть раньше конца. Сохраните главы по порядку, без случайных пересечений и границ за пределами записи. Если финал содержит тишину, отдельно решите, входит ли она в последнюю главу.
Создайте текстовый файл глав в UTF-8
Сохраните chapters.txt как обычный текст UTF-8. Первая строка — ;FFMETADATA1. Каждая секция [CHAPTER] задаёт одну главу; TIMEBASE=1/1000 означает миллисекунды, START и END — её границы, title — название. При таком масштабе одна минута равна 60000.
Ниже учебная заготовка для ровно двухминутной записи с границей в 01:00. Для собственного файла замените названия и все числа. Нельзя оставлять END=120000, если запись короче двух минут, или считать эти числа универсальными настройками.
;FFMETADATA1 title=Учебная запись [CHAPTER] TIMEBASE=1/1000 START=0 END=60000 title=Подготовка записи [CHAPTER] TIMEBASE=1/1000 START=60000 END=120000 title=Проверка результата
Если в названиях нужны служебные символы формата — знак равенства, точка с запятой, решётка или обратная косая черта — их требуется экранировать. Для первой пробы используйте простые названия, затем проверьте сложные отдельно. Не сохраняйте файл как документ Word и не подменяйте UTF-8 другой кодировкой.
Верхняя строка title=Учебная запись задаёт общий заголовок. В показанной команде общие метаданные берутся из chapters.txt: прежние теги исходника могут не перейти автоматически. Заранее выпишите нужные сведения и после сохранения проверьте их отдельно. Команда не предназначена для архивного сохранения всех тегов и обложки.
Подключите главы и сохраните новый M4B
Откройте терминал в папке с рабочим аудио и chapters.txt. Используйте новое имя результата. Пути с пробелами заключайте в кавычки. В примере -n запрещает перезапись существующего выходного файла: при таком сообщении выберите другое имя, а не включайте перезапись вслепую.
ffmpeg -hide_banner -n -i "sample.m4a" -f ffmetadata -i "chapters.txt" -map 0:a:0 -map_metadata 1 -map_chapters 1 -c:a copy "sample-with-chapters.m4b"
Первый вход, номер 0, содержит звук; второй, номер 1, — метаданные. -map 0:a:0 выбирает первую аудиодорожку первого входа. -map_metadata 1 берёт общие теги из второго входа, а -map_chapters 1 — главы. -c:a copy переносит выбранный сжатый аудиопоток без нового кодирования.
Эта команда не добавляет другие аудиодорожки, видео или обложку автоматически. Если они нужны, подготовьте отдельную схему переноса и проверьте её. Для этой инструкции достаточно одной подтверждённой AAC-дорожки.
Дождитесь завершения и прочитайте ошибку, если результат не создан. Сообщение о несовместимом кодеке, неверном файле метаданных и уже существующем имени требуют разных действий. Не меняйте сразу несколько параметров: сначала подтвердите формат входа и исправность chapters.txt.
Проверьте метаданные и настоящие переходы
ffprobe -v error -show_chapters -show_entries format=duration -of json "sample-with-chapters.m4b"
Проверьте число глав, их названия, start_time и end_time в секундах, а также длительность результата. Для учебной заготовки ожидаются интервалы 0–60 и 60–120 секунд. Ошибка масштаба времени заметна здесь раньше, чем при попытке прослушать весь материал.
Затем откройте именно сохранённый M4B в выбранном плеере. Найдите оглавление и перейдите к каждой главе: услышанная тема должна соответствовать названию. Проверьте начало и конец аудио, а также место возле каждого перехода. ffprobe подтверждает записанные данные, но не заменяет такую проверку приложения.
Если ffprobe видит главы, а плеер их не показывает, не переписывайте границы наугад. Сначала проверьте поддержку глав M4B в этом приложении и убедитесь, что открыт новый файл. Если переход ведёт не к той теме, сравните версию звука и время: причина может быть в разметке до монтажа.
Сохраните исходник, готовый M4B, chapters.txt и журнал проверки. Для общего порядка хранения используйте архив расшифровок и связанных записей. Связь между текстом, границами и версией аудио важнее похожих имён файлов.
Учебная техническая проба на двух секундах
Для проверки команды использован синтетический двухсекундный AAC-файл и две главы: «Первая часть» от 0 до 1 секунды и «Вторая часть» от 1 до 2 секунд. FFmpeg 6.1.1 сохранил M4B; ffprobe показал два русских названия и длительность 2 секунды. Хеш сжатых аудиопакетов исходника и результата совпал.
| Проверка | Учебный результат | Что подтвердить на своей записи |
|---|---|---|
| Число глав | 2 главы | Все задуманные разделы сохранены |
| Границы теста | 0–1 и 1–2 секунды | Время соответствует финальному монтажу |
| Аудиопоток | Хеш сжатых пакетов совпал | Нужная дорожка перенесена и воспроизводится |
| Переходы в плеере | В этом техническом тесте не проверялись | Оглавление видно, переходы открывают нужную речь |
Это проверка переноса метаданных и аудиопотока на учебном сигнале. Она не подтверждает навигацию во всех плеерах и не заменяет прослушивание вашей записи. Двухминутная заготовка выше — отдельный пример для самостоятельной адаптации.
Журнал подготовки M4B
Исходник / кодек / длительность: Финальная версия аудио: FFmpeg / ffprobe / версии: Глава / название / начало / конец: Масштаб времени в chapters.txt: Кодировка UTF-8: Общие теги, которые нужно сохранить: Команда / выходной файл: Число глав и названия по ffprobe: Длительность результата: Плеер / версия / оглавление видно: Каждый переход проверен по речи: Начало и конец прослушаны: Сохранены исходник, M4B, chapters.txt и текст:
Частые вопросы
Можно просто переименовать M4A в M4B?
Переименование не создаёт главы. Их нужно записать в контейнер, затем проверить список и переходы.
Главы создают отдельные аудиофайлы?
В показанном процессе аудио остаётся непрерывным внутри одного результата. Главы добавляют навигационные интервалы.
Почему главы видны в ffprobe, но отсутствуют в плеере?
Возможны ограничения приложения или открытие старой копии. Проверьте поддержку глав M4B и точный файл до изменения метаданных.
После удаления паузы нужно менять главы?
Да, проверьте все границы после изменённого участка по финальному аудио. Список от старой версии может вести к другой реплике.
Копирование потока улучшает звук?
Нет. -c:a copy переносит выбранный аудиопоток без нового кодирования; это не удаление шума и не восстановление качества.