Поскольку, по-видимому, нет способа сообщить iTunes или iOS, что MP3 содержат аудиокнигу (или радиоплеер) по тегу ID3 или расширению файла, я хотел бы смешать их в MPEG- 4 Часть 14 контейнеры с расширением файла .m4b
(без преобразования, т.е. перекодирования или перекодирования аудиопотока в AA C) и установите соответствующий тег типа носителя (stik
= 2 Аудиокнига ).
$ ffmpeg -hide_banner -y \
-i "infile.mp3" -codec copy -map 0 \
"outfile.m4b"
При автоматическом определении нужного формата по имени выходного файла FFmpeg (версия 4.2.1 на момент написания) переключает режим совместимости -f ipod
для .m4a
и .m4b
, что означает, что он явно не будет принимать аудио MPEG 1/2 Layer 3 в контейнере MP4:
[ipod @ 00000223bd927e40]
Не удалось найти тег для кода c mp3 в потоке # 0, код c в настоящее время не поддерживается в контейнере
Не удалось записать заголовок для выходного файла # 0 (неверный код c параметры?): неверный аргумент
Я могу переопределить это (или изменить впоследствии расширение файла при использовании "outfile.mp4"
):
$ ffmpeg -hide_banner -y \
-i "infile.mp3" -codec copy -map 0 -f mp4 \
"outfile.m4b"
Время, близкое к нулю, необходимое для преобразования, и FFprobe уверяют меня, что повторное смешивание прошло успешно:
Stream #0:0(und): Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s (default)
Пользовательские поля тегов ID3v2 и поля без известного родственного MP4 были удалены. Я хотел бы сохранить их!
Как мне это сделать с -map_metadata
, если это вообще возможно?
Как я могу использовать -metadata
, чтобы добавить необходимое поле тега ( atom: stik
), который помечает файл как аудиокнигу - в более общем виде:
как добавить поле метаданных, указанное вручную (например, атом или поле MP4) с помощью FFmpeg?
$ ffmpeg -hide_banner -y \
-i "infile.mp3" -codec copy -map 0 -f mp4 \
-metadata:s:a:0 language=deu \
-metadata stik=2
"outfile.m4b"
-metadata[:metadata_specifier]
key=value (output,per-metadata)
Установка пары ключ / значение метаданных. - …
-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (output,per-metadata)
Установить информацию метаданных следующего выходного файла из infile. Обратите внимание, что это индексы файлов (начиная с нуля), а не имена файлов. Необязательные параметры metadata_spec_in / out указывают, какие метаданные следует копировать. Спецификатор метаданных может иметь следующие формы: g
глобальные метаданные, т.е. метаданные, которые применяются ко всему файлу s[:stream_spec]
метаданные для каждого потока. stream_spe c является спецификатором потока, как описано в главе «Спецификаторы потока». В спецификаторе входных метаданных первый совпадающий поток копируется из. В спецификаторе выходных метаданных все совпадающие потоки копируются в. c:chapter_index
метаданные для каждой главы. chapter_index - это индекс главы, начинающийся с нуля. p:program_index
метаданные для каждой программы. program_index - это индекс программы, начинающийся с нуля.
Если спецификатор метаданных опущен, по умолчанию используется глобальный.
По умолчанию глобальные метаданные копируются из Первый входной файл, метаданные для каждого потока и главы копируется вместе с потоками / главами. Эти сопоставления по умолчанию отключены путем создания любого сопоставления соответствующего типа. Отрицательный индекс файла можно использовать для создания фиктивного сопоставления, которое просто отключает автоматическое c копирование.
PS
- Кажется, что Apple формально не документирует
stik
, MPMediaType немного отличается. Указатели на обратное приветствуются. - В идеале я хотел бы автоматически добавлять все файлы
*.mp3
в подкаталоге, отсортированные по алфавиту (которые имеют одинаковые настройки кодировщика), как главы в одном контейнере .mp4
, но это, вероятно, заслуживает отдельного вопроса.