使用FFMPEG将多个.srt字幕流添加到MP4

4

经过多次尝试,我成功地将多个字幕流添加到一个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”这种字幕类型。如果我使用相同的命令,但是想要使用“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'一起使用?同时,我会寻找解决方案,找到后会在这里发布。

2个回答

5

SRT字幕在MP4中并未得到官方支持,ffmpeg将无法进行混流。它们必须转换为支持计时文本格式,就像您使用 mov_text 所做的那样。


您可以摆脱这个警告

Codec for stream 0 does not use global headers but container format requires global headers

通过添加 -flags +global_header 来实现。

这正是我担心的。如果可能的话,我该如何使其工作并以_WEBVTT_格式显示字幕?这是否与FFMPEG有关呢?...?! - Dragonix
目前,FFmpeg不支持在MP4中使用WebVTT。 - Gyan

2
您可以将字幕转换为支持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

为了保留输入文件的元数据,请在输出路径之前添加-movflags use_metadata_tags -map_metadata 0 参考 - ddelange
@ddelange 我不确定我理解了。.srt 文件通常没有元数据,至少在我的经验中是这样的。 - Swannie
啊,抱歉,我表达不清楚:建议是保留嵌入在输入视频文件中的元数据。 - ddelange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接