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

Dra*_*nix 3 video ffmpeg subtitle

经过大量的反复试验,我设法将多个字幕流添加到一个 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
Run Code Online (Sandbox Code Playgroud)

然后,我执行以下命令。我从不同来源收集了这些信息,但我不是 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
Run Code Online (Sandbox Code Playgroud)

几秒钟后,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
Run Code Online (Sandbox Code Playgroud)

我不确定副标题的类型是否是我应该使用的 -> '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
Run Code Online (Sandbox Code Playgroud)

对我来说唯一的问题是如何使它与 'srt' 或 'subrip' 一起使用?与此同时,我会寻找解决方案,找到后,我会把它放在这里。

Gya*_*yan 5

MP4 中不正式支持 SRT,ffmpeg 不会对它们进行多路复用。它们必须转换为您使用mov_text.


你可以摆脱警告

Codec for stream 0 does not use global headers but container format requires global headers
Run Code Online (Sandbox Code Playgroud)

通过添加-flags +global_header.