178

我正在尝试使用 ffmpeg 将文本字幕添加到 .mp4 容器:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mp4

当我试图运行这条线时,它给了我一个错误:

流图的数量必须与输出流的数量相匹配。

如果我尝试将 mp4 更改为 mkv(虽然 mp4 支持文本字幕),像这样:

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mkv

它正确映射流,但给出错误:

找不到输出流 #0.2 的编码器(编解码器 id 94210)

当我启动

ffmpeg -codecs

我可以看到支持 srt 编解码器作为解码器和编码器,但是我不确定 mp4 和 mkv subs 编码使用什么,以及是否需要打开它或单独编译。

4

9 回答 9

272
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4

-vf subtitles=infile.srt不适用-c copy


的顺序-c copy -c:s mov_text很重要。你在告诉 FFmpeg:

  1. 视频:复制,音频:复制,字幕:复制
  2. 副标题:mov_text

如果你把它们颠倒过来,你就是在告诉 FFmpeg:

  1. 副标题:mov_text
  2. 视频:复制,音频:复制,字幕:复制

或者,您可以-c:v copy -c:a copy -c:s mov_text按任何顺序使用。

于 2013-07-11T02:53:41.330 回答
134

注意:此解决方案将字幕“刻录”到视频中,因此视频的每个观众都将被迫看到它们。

如果您的 ffmpeg 在编译时启用了 libass,您可以直接执行以下操作:

ffmpeg -i mymovie.mp4 -vf subtitles=subtitles.srt mysubtitledmovie.mp4

例如对于 Ubuntu 20.10 就是这种情况,您可以检查是否ffmpeg --version--enable-libass.

否则,您可以使用该libass库(确保您的 ffmpeg 安装在配置中有该库--enable-libass)。

首先将字幕转换为.ass格式:

ffmpeg -i subtitles.srt subtitles.ass

然后使用视频过滤器添加它们:

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4
于 2012-10-29T15:55:17.667 回答
74

您正在尝试将字幕复用为字幕流。这很简单,但 MP4(或 M4V)和 MKV 使用不同的语法。在这两种情况下,您都必须指定视频和音频编解码器,或者如果您只想添加字幕,则只需复制流。

MP4:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s mov_text output.mp4

MKV:

ffmpeg -i input.mp4 -f srt -i input.srt \
-map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy \
-c:s srt  output.mkv
于 2015-10-22T20:13:36.993 回答
13

MKV 容器几乎支持任何视频和音频编解码器,还支持字幕和 DVD 菜单。因此,您可以使用带有字幕的 MKV 容器将编解码器从输入视频复制到输出视频。首先你应该将 SRT 转换为 ASS 字幕格式

ffmpeg -i input.srt input.ass

并将 ASS 字幕嵌入到视频中

ffmpeg -i input.mp4 -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

还使用 VMW 文件。

ffmpeg -i input.wmv -i input.ass -c:v copy -c:a copy -c:s copy -map 0:0 -map 0:1 -map 1:0 -y out.mkv

参见 wiki 页面容器格式的比较

于 2014-06-18T20:08:13.623 回答
11

ffmpeg 支持mov_text字幕编码器,这是 MP4 容器中唯一支持的一种,可由 iTunes、Quicktime、iOS 等播放。

您的行将显示为:

ffmpeg -i input.mp4 -i input.srt -map 0:0 -map 0:1 -map 1:0 -c:s mov_text output.mp4

于 2013-11-26T19:37:12.417 回答
6

我尝试使用 MP4Box 来完成这项任务,但它无法处理我正在处理的 M4V。我使用以下命令行成功地将 SRT 嵌入为带有 ffmpeg 的软字幕:

ffmpeg -i input.m4v -i input.srt -vcodec copy -acodec copy -scodec copy -map 0:0 -map 0:1 -map 1:0 -y output.mkv

像您一样,我必须使用 MKV 输出文件 - 我无法创建 M4V 文件。

于 2012-12-04T11:42:48.923 回答
4

我将提供一个简单而通用的答案,它适用于任意数量的音频和srt字幕,并尊重可能包含mkv容器的元数据。所以它甚至会添加 matroska 可能包含的图像作为附件(尽管不是其他类型的 AFAIK)并将它们转换为轨道;您将无法观看,但它们会在那里(您可以对它们进行解复用)。啊,如果mkv也有mp4章节。

ffmpeg -i <mkv-input> -c copy -map 0 -c:s mov_text <mp4-output>

正如你所看到的,它-map 0告诉FFmpeg添加所有曲目,包括元数据、章节、附件等​​。如果有无法识别的“曲目”(mkv允许附加任何类型的文件),它将以错误结束。

mkv2mp4.bat如果您通常这样做,您可以创建一个简单的批处理来创建一个与mkv同名的mp4。使用错误控制、不同的输出名称等会更好,但你明白了。

@ffmpeg -i %1 -c copy -map 0 -c:s mov_text "%~n1.mp4"

现在你可以简单地运行

mkv2mp4 "Video with subtitles etc.mkv"

它将创建包含最大信息的“带字幕的视频 etc.mp4”。

于 2018-05-04T11:16:02.460 回答
-1

简单示例:

videoSource=test.mp4
videoEncoded=test2.mp4
videoSubtitle=test.srt
videoFontSize=24
ffmpeg -i "$videoSource" -vf subtitles="$videoSubtitle":force_style='Fontsize="$videoFontSize"' "$videoEncoded"

只替换linux变量

于 2016-11-18T16:32:16.697 回答
-3

这就是 mkv 是这么好的容器的原因,尤其是现在它已经成熟了:

mkvmerge -o output.mkv video.mp4 subtitle.srt
于 2015-04-20T00:12:29.927 回答