ffmpeg 中是否有一个选项可以指定默认显示的字幕轨道?

ffmpeg 中是否有一个选项可以指定默认显示的字幕轨道?

我有一个 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%

答案1

之前接受的答案不再正确,因为该disposition标志已添加到 ffmpeg。使用您提供的示例,您可以将字幕轨道设置为默认显示,如下所示:

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

格式为-disposition[:stream_specifier] value

如果您需要从流中删除先前设置的配置(例如,流设置为default,但您想要禁用此功能),请使用值0

您可以在ffmpeg 文档通过搜索“disposition”。

答案2

您可以使用MP4Box 0.6.2-DEV-rev453(2016 年 5 月)或更高版本可执行此操作:

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 识别为强制。

答案3

不,ffmpeg 中没有选项可以指定默认显示的字幕轨道。

(ffmpeg 版本 2.6.1 在 Arch 上默认使用 gcc 4.9.2(GCC)20150304(预发布版)构建,编译标志请参见答案末尾)

强调 ffmpeg 中缺少用于设置默认/强制字幕流的命令行选项的资源包括以下内容:

最后,这个问题StackOverflow 上的问题与你相同,但针对的是 mkv,并强调 ffmpeg 是罪魁祸首,因为mkvpropedit(部分mkvtoolnix) 可以做到。

不过,有一个潜在的解决方法

2013 年 3 月 ffmpeg 错误报告 (仍然打开)处理 mkv 和字幕的默认标志,并解释我们可以在某些情况下用来规避此限制的内容:

Matroska 规范 -http://matroska.org/technical/specs/index.html(搜索 FlagDefault) - 如果未指定任何内容,则指定默认标志的值为“默认”,因此解复用器将所有字幕轨道标记为“默认”。

所以 ffmpeg可能在某些情况下在我们的字幕流上写入默认标志;我尝试使用不同的输入视频文件并得到了不同的结果:

  • 大雄兔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 更好,因为它有一个已知的工具可以很好地完成这项工作(mkvpropeditmkvtoolnix)。
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 --启用-libvpx --启用-libx264 --启用-libx265 --启用-libxvid --启用-runtime-cpudetect --启用-shared --启用-swresample --启用-vdpau --启用-version3 --启用-x11grab`

相关内容