Вопрос: Как установить собственные метаданные метаданных обработчика для потока субтитров с использованием FFMPEG


В настоящее время я использую FFMPEG  для встраивания субтитров в файлы MP4, и я смущен, пытаясь понять, как настраивать тег метаданных «handler_name» в моем потоке субтитров, чтобы я мог управлять именем, которое отображается при выборе субтитров внутри проигрывателя, например MPC-HC  (Media Player Classic)?

Моя текущая команда для встраивания субтитров:

ffmpeg -i "video.mp4" -sub_charenc UTF-8 -i "video.srt" -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:0 handler_name="English" -id3v2_version 3 -write_id3v1 1 "subbed_video.mp4"

Вывод:

C:\path\to>ffmpeg -y -i "video.mp4" -sub_charenc UTF-8 -i "video.srt" -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language="eng" -metadata:s:s:0 handler_name="English" -id3v2_version 3 -write_id3v1 1 "subbed_video.mp4"
ffmpeg version N-68482-g92a596f Copyright (c) 2000-2014 the FFmpeg developers
  built on Dec 16 2014 02:53:08 with gcc 4.9.2 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable
  libavutil      54. 15.100 / 54. 15.100
  libavcodec     56. 15.100 / 56. 15.100
  libavformat    56. 15.105 / 56. 15.105
  libavdevice    56.  3.100 / 56.  3.100
  libavfilter     5.  3.101 /  5.  3.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf55.34.101
  Duration: 01:27:44.17, start: 0.000000, bitrate: 878 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x536 [SAR 1:1 DAR 160:67], 842 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (HE-AAC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 32 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:2(eng): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
    Metadata:
      handler_name    : SubtitleHandler
Input #1, srt, from 'video.srt':
  Duration: N/A, bitrate: N/A
    Stream #1:0: Subtitle: subrip
Output #0, mp4, to 'subbed_video.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.15.105
    Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x536 [SAR 1:1 DAR 160:67], q=2-31, 842 kb/s, 24 fps, 24 tbr, 12288 tbn, 12288 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, stereo, 32 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
    Stream #0:2(eng): Subtitle: mov_text ([8][0][0][0] / 0x0008) (default)
    Metadata:
      handler_name    : English
      encoder         : Lavc56.15.100 mov_text
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #0:2 -> #0:2 (mov_text (native) -> mov_text (native))
Press [q] to stop, [?] for help
frame=126337 fps=13751 q=-1.0 Lsize=  564499kB time=01:27:44.17 bitrate= 878.5kbits/s
video:541239kB audio:20564kB subtitle:39kB other streams:0kB global headers:0kB muxing overhead: 0.472881%

Команда завершается успешно, но когда я запускаю:

ffmpeg -i "C:\path\to\subbed_video.mp4"

это показывает:

Stream #0:2(eng): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
Metadata:
  handler_name    : SubtitleHandler

Несмотря на то, что вывод команды показывает:

Stream #0:2(eng): Subtitle: mov_text ([8][0][0][0] / 0x0008) (default)
Metadata:
  handler_name    : English
  encoder         : Lavc56.15.100 mov_text

Независимо от того, какие параметры я попробовал или какой порядок я помещаю в теги-metadata, этот тег просто не будет установлен с FFMPEG ? Я нахожу это действительно уродливо видеть SubtitleHandler [eng] (tx3g) (английский)  в меню моего плеера, а не просто говоря английский ,

Теперь я могу обойти эту проблему, используя MP4Box  для встраивания субтитров в мой mp4, используя:

MP4BOX -lang eng -add "video.srt:name=English" "video.mp4" -out "subbed_video.mp4"

Добавление «Название = Английский»  позволяет мне настроить «handler_name» потока субтитров на «английский»; который отлично отображает FFMPEG  а также MPC-HC , но проблема в том, что я не хочу, чтобы мое приложение зависело от дополнительного внешнего инструмента, такого как MP4Box  если его можно избежать?

Я был бы очень признателен за любые рекомендации относительно правильного установки тега «handler_name» в потоке субтитров, используя FFMPEG , или, может быть, подтверждение того, FFMPEG  может даже обрабатывать этот тег, поскольку он технически не указан в Список действительных метаданных FFMPEG ?

Постскриптум В качестве альтернативы FFMPEG , Я был бы готов использовать AtomicParsley  для установки «handler_name», поскольку я уже буду использовать его для установки расширенных метаданных на «subbed_video.mp4» после того, как я вставляю субтитры. Кажется, что с AtomicParsley , но я не смог понять половину справочной информации в отношении настройки пользовательских ATOM.

TIA !!


9


источник


Ответы:


Наконец понял это сегодня, и я не могу поверить, что я не пробовал это раньше ... Хотя имя тега указано как handler_name =  в выводе FFMPEG активный тег для использования - это просто обработчик = , без добавления _имя ,

-metadata: s: s: 0 handler = "English"

ffmpeg -i "video.mp4" -sub_charenc UTF-8 -i "video.srt" -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:0 handler="English" -id3v2_version 3 -write_id3v1 1 "subbed_video.mp4"

10



Если вы используете VLC, и принятый ответ не работает, вы должны добавить title вариант для ваших метаданных потока. Пример OPs:

ffmpeg -i "video.mp4" -sub_charenc UTF-8 -i "video.srt" -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=eng -metadata:s:s:0 title="English" -id3v2_version 3 -write_id3v1 1 "subbed_video.mp4" 

То же самое касается других потоков. Протестировано на версии FFmpeg N-79630-g9ac154d.


0