我有一个 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
这会将输出文件中的字幕流标记为强制。
然而,此标记仅从以下版本的程序开始才被识别:
MPC-HC 1.7.10.207(2016 年 5 月)
VLC 媒体播放器 3.0.0-20161101(2016 年 11 月)
我看到有人提到这个帖子在 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 中缺少用于设置默认/强制字幕流的命令行选项的资源包括以下内容:
- 2012 年 10 月邮件列表主题(深入研究 matroska 格式并解释 ffmpeg 没有在必填字段中写入)
- 2013 年 1 月的这个帖子(表明 ffmpeg 开发人员对此缺乏兴趣)
- 2014 年 1 月的这个帖子(询问是否要翻转 Matroska 容器中的默认标志,但无济于事)
- 这个最近的论坛帖子(MP4,来自 ffmeg 论坛)
最后,这个问题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 更好,因为它有一个已知的工具可以很好地完成这项工作(mkvpropedit从mkvtoolnix)。
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`