3

У меня есть видео в формате MP4, в котором преобладает английский язык, но есть сцена, в которой персонаж говорит на другом языке. У меня есть дорожка английских субтитров в формате SRT для диалога этого персонажа. Можно ли встроить дорожку субтитров в сам MP4 и включить ее по умолчанию, не включая ее вручную. С помощью команды, которую я сейчас использую (ниже), дорожка субтитров добавляется в файл, но мне приходится вручную выбирать ее при воспроизведении видео.

ffmpeg -i movie.mp4 -i movie.srt -c:v copy -c:a copy -c:s mov_text \
  -metadata:s:s:0 language=eng movie-sub.mp4

Есть ли еще какие-то метаданные, которые мне нужно добавить, чтобы сабы показывались по умолчанию? Я хотел бы избежать жестких подводных лодок, если это возможно. Если это ограничение контейнера MP4, я бы хорошо переключился на другой формат, такой как MKV.

Вывод из ffmpeg:

ffmpeg version 2.1.1 Copyright (c) 2000-2013 the FFmpeg developers
  built on Dec 31 2013 15:44:02 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
  configuration: --prefix=/opt/local --enable-swscale --enable-avfilter --enable-avresample --enable-libmp3lame --enable-libvorbis --enable-libopus --enable-libtheora --enable-libschroedinger --enable-libopenjpeg --enable-libmodplug --enable-libvpx --enable-libspeex --enable-libass --enable-libbluray --enable-gnutls --enable-libfreetype --disable-indev=jack --disable-outdev=xv --mandir=/opt/local/share/man --enable-shared --enable-pthreads --cc=/usr/bin/clang --arch=x86_64 --enable-yasm --enable-gpl --enable-postproc --enable-libx264 --enable-libxvid --enable-version3 --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-nonfree --enable-libfaac
  libavutil      52. 48.101 / 52. 48.101
  libavcodec     55. 39.101 / 55. 39.101
  libavformat    55. 19.104 / 55. 19.104
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 90.100 /  3. 90.100
  libavresample   1.  1.  0 /  1.  1.  0
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'movie.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2013-03-18 08:10:43
  Duration: 01:37:23.05, start: 0.000000, bitrate: 1877 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1683 kb/s, 23.98 fps, 23.98 tbr, 48k tbn, 47.95 tbc (default)
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default)
Input #1, srt, from 'movie.srt':
  Duration: N/A, bitrate: N/A
    Stream #1:0: Subtitle: subrip
Output #0, mp4, to 'movie-sub.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    encoder         : Lavf55.19.104
    Stream #0:0(und): Video: h264 ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=2-31, 1683 kb/s, 23.98 fps, 48k tbn, 48k tbc (default)
    Stream #0:1(und): Audio: aac ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 191 kb/s (default)
    Stream #0:2(eng): Subtitle: mov_text ([8][0][0][0] / 0x0008)
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #1:0 -> #0:2 (subrip -> mov_text)
Press [q] to stop, [?] for help
frame=140093 fps=9457 q=-1.0 Lsize= 1340911kB time=01:37:23.04 bitrate=1880.0kbits/s    
video:1200658kB audio:136946kB subtitle:0 global headers:0kB muxing overhead 0.247196%

2 ответа2

1

Вы можете использовать MP4Box 0.6.2-DEV-rev453 (май 2016 г.) или выше, чтобы сделать это:

mp4box -add alfa.mp4 -add bravo.srt:txtflags=0xC0000000 -new charlie.mp4

пример

Это пометит поток субтитров в выходном файле как принудительный.

Однако этот знак будет распознаваться только начиная с этих версий программ:


Я видел упоминания об этом посте в списке рассылки FFmpeg о патче, который реализует расположение для FFmpeg:

ffmpeg -i alfa.mp4 -i bravo.srt -c copy -c:s mov_text -disposition:s forced charlie.mp4

Однако после того, как он попробовал это с "принудительно" и "по умолчанию", субтитры, отмеченные FFmpeg, не распознаются как принудительно ни MPC-HC, ни VLC.

1

Нет, в ffmpeg нет опции для указания дорожки субтитров, которая должна отображаться по умолчанию.

(ffmpeg версии 2.6.1, собранная с gcc 4.9.2 (GCC) 20150304 (предварительная версия) по умолчанию для Arch, см. конец ответа для флагов компиляции)

Ресурсы, подчеркивающие отсутствие параметров командной строки для настройки потока стандартных / принудительных субтитров в ffmpeg, включают следующее:

Наконец, этот вопрос о StackOverflow задает тот же вопрос, что и у вас, но для mkv, и подчеркивает тот факт, что ffmpeg является виновником, поскольку mkvpropedit (часть mkvtoolnix) может это сделать.

Тем не менее, существует потенциальный обходной путь

В этом отчете об ошибке ffmpeg в марте 2013 года (все еще открытом) рассматриваются mkv и флаг по умолчанию для субтитров и объясняется кое-что, что мы можем использовать, чтобы обойти это ограничение в некоторых сценариях:

Спецификация Matroska - http://matroska.org/technical/specs/index.html (search for FlagDefault) - указывает, что значением флага по умолчанию является "default", если ничего не указано, демультиплексор помечает все дорожки субтитров как "по умолчанию".

Поэтому ffmpeg может в некоторых случаях записывать флаг по умолчанию в наш поток субтитров; Я попробовал это с различными входными видеофайлами и получил смешанные результаты:

  • с Big Buck Bunny AVI Mpeg4 и случайным файлом .srt, поток субтитров mkv с ремиксом действительно имел флаг по умолчанию:

    $ ffmpeg -i big_buck_bunny_480p_surround-fix.avi -i subtitle.srt -c copy test.mkv
    $ ffmpeg -i test.mkv
    Input #0, matroska,webm, from 'test.mkv':
      Metadata:
        ENCODER         : Lavf56.25.101
      Duration: 00:28:31.40, start: 0.000000, bitrate: 1028 kb/s
        Stream #0:0: Video: mpeg4 (Simple Profile), yuv420p, 854x480 [SAR 1:1 DAR 427:240], 24 fps, 24 tbr, 1k tbn, 24 tbc (default)
        Stream #0:1: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s (default)
        Stream #0:2: Subtitle: subrip (default)
    
  • однако я не мог воспроизвести это с образцом, содержащим mp4, с образцом H264, ни с личным mp4, поэтому я предполагаю, что mp4 --> mkv не работает. Но что, если...?

    $ ffmpeg -i sample.mp4 -c copy sample.avi
    $ ffmpeg -i sample.avi -i subtitle.srt -c copy sample.mkv
    $ ffmpeg -i sample.mkv
    ...
    Input #0, matroska,webm, from 'sample.mkv':
      Metadata:
        ENCODER         : Lavf56.25.101
      Duration: 00:28:31.40, start: 0.000000, bitrate: 2 kb/s
        Stream #0:0: Video: h264 (Constrained Baseline), yuv420p(tv, bt709), 560x320, SAR 1:1 DAR 7:4, 60 fps, 60 tbr, 1k tbn, 60 tbc (default)
        Stream #0:1: Audio: aac (LC), 48000 Hz, mono, fltp (default)
        Stream #0:2: Subtitle: subrip (default)
    

ПОБЕДА! Выполнение mp4 --> avi а затем avi + srt --> mkv включает поток субтитров по умолчанию, и VLC отображает их правильно.

Конечно, это очень окольный путь, и я бы предпочел не думать о потере информации в процессе, но, по крайней мере, это работает.

Резюме

  • ffmpeg определенно не приспособлен для установки потоков по умолчанию или принудительно,
  • mkv, вероятно, лучше, чем mp4 в качестве исходного контейнера, поскольку в нем есть известный инструмент, который отлично справляется со своей задачей (mkvpropedit из mkvtoolnix).
Подробности версии ffmpeg:

ffmpeg версии 2.6.1, собранная с gcc 4.9.2 (GCC) 20150304 (предварительная версия) конфигурация: --prefix =/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable- avresample --enable-fontconfig --enable-gnutls --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmodplug --enable- libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libssh --enable-libtheora --enable- libv4l2 --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-runtime-cpudetect --enable-shared --enable-swresample --enable-vdpau - enable-version3 --enable-x11grab`

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .