经过大量的反复试验,我设法为一个MP4添加了多个字幕流。 但是,在检查MP4的元数据时,我看到一些我想要改变的结果,希望有人可以帮助我,或者可以解释它为什么会发生。
这是输入(我添加了字幕流的原始MP4)
$ ffmpeg -i movie.mp4
ffmpeg version 2.8.11-0ubuntu0.16.04.1 Copyright (c) 2000-2017 the FFmpeg developers
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 2048x872 [SAR 1:1 DAR 256:109], 2352 kb/s, 24 fps, 24 tbr, 24 tbn, 48 tbc (default)
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 440 kb/s (default)
Metadata:
creation_time : 1970-01-01 00:00:00
handler_name : SoundHandler
然后,我执行以下命令。我从不同来源收集了这些信息,我不是FFMPEG大师:)
ffmpeg -i movie.mp4 -f srt -i nl.srt -i mk.srt -i sk.srt \
-map 0:0 -map 0:1 -map 1:0 -map 2:0 -map 3:0 \
-c:v copy -c:a copy \
-c:s mov_text -c:s mov_text -c:s mov_text \
-metadata:s:s:0 language=nld -metadata:s:s:1 language=mkd -metadata:s:s:2 language=skv \
NEW.mp4
在几秒钟内,创建了NEW.mp4,在播放视频时,我获得了我期望的视频和音频,以及在播放期间可以切换的3个字幕流。字幕本身也是我期望的。
NEW.mp4的输出
$ ffmpeg -i NEW.mp4
ffmpeg version 2.8.11-0ubuntu0.16.04.1 Copyright (c) 2000-2017 the FFmpeg developers
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 2048x872 [SAR 1:1 DAR 256:109], 2352 kb/s, 24 fps, 24 tbr, 12288 tbn, 48 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 5.1, fltp, 440 kb/s (default)
Metadata:
handler_name : SoundHandler
Stream #0:2(nld): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s (default)
Metadata:
handler_name : SubtitleHandler
Stream #0:3(mkd): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s
Metadata:
handler_name : SubtitleHandler
Stream #0:4(svk): Subtitle: mov_text (tx3g / 0x67337874), 0 kb/s
Metadata:
handler_name : SubtitleHandler
我不确定字幕的类型是否应该使用 - > 'mov_text'。如果我使用相同的命令但不使用'mov_text',我想使用'srt'或'subrip',我会遇到一些错误。
[mp4 @ 0x7ba2c0] Codec for stream 0 does not use global headers but container format requires global headers
[mp4 @ 0x7ba2c0] Codec for stream 1 does not use global headers but container format requires global headers
[mp4 @ 0x7ba2c0] Could not find tag for codec subrip in stream #2, codec not currently supported in container
对我而言,唯一的问题是如何才能让它与'srt'或'subrip'一起使用?与此同时,我会寻找解决方案,一旦找到,我会把它放在这里。
答案 0 :(得分:3)
MP4中没有正式支持SRT,ffmpeg不会将它们复用。必须将它们转换为您使用mov_text
支持的定时文本格式。
你可以摆脱警告
Codec for stream 0 does not use global headers but container format requires global headers
添加-flags +global_header
。
答案 1 :(得分:1)
您可以将字幕转换为 MP4 支持的 mov_text。就像下面的命令一样。
ffmpeg -i input.mp4 -i dutch.srt -i french.srt -i italian.srt -i spanish.srt -i swedish.srt -map 0:v -map 0:a -map 1 -map 2 -map 3 -map 4 -map 5 -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=dut -metadata:s:s:1 language=fre -metadata:s:s:2 language=ita -metadata:s:s:3 language=spa -metadata:s:s:4 language=swe output.mp4
此外,您还可以选择使用 ffmpeg 更改容器以使用 mkv,然后您无需转换字幕,因为 mkv 几乎支持任何内容。
ffmpeg -i input.mp4 -sub_charenc ISO-8859-1 -i dutch.srt -sub_charenc ISO-8859-1 -i french.srt -sub_charenc ISO-8859-1 -i italian.srt -sub_charenc ISO-8859-1 -i spanish.srt -sub_charenc ISO-8859-1 -i swedish.srt -map 0:v -map 0:a -map 1 -map 2 -map 3 -map 4 -map 5 -c:v copy -c:a copy -c:s srt -metadata:s:s:0 language=dut -metadata:s:s:1 language=fre -metadata:s:s:2 language=ita -metadata:s:s:3 language=spa -metadata:s:s:4 language=swe output.mkv
在上述情况下,我使用 -sub_charenc ISO-8859-1,因为 srt 文件以 ISO-8859 编码。如果 srt 不是以 UTF-8 编码,您将收到如下错误
Invalid UTF-8 in decoded subtitles text; maybe missing -sub_charenc option Error while decoding stream #3:0: Invalid data found when processing input