Метаданные при перекомпоновке аудиокниг MP3 в Apple MP4 с FFmpeg - PullRequest
0 голосов
/ 25 марта 2020

Поскольку, по-видимому, нет способа сообщить 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"

Документация FFmpeg

  • -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 , но это, вероятно, заслуживает отдельного вопроса.
...