使用ffmpeg添加文本字幕


121

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

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

当我尝试运行此行时,它给我一个错误:

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

如果我尝试将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子编码使用什么,以及我是否需要将其打开或单独编译。

Answers:


195
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按任何顺序使用。


13
此方法将字幕添加到文件中作为流之一,因此需要播放器支持以显示字幕(例如VLC)
BollMose15

1
这是否意味着字幕可用,但尚未刻录到视频中?我可以显示是否要点播吗?
太阳

3
是的,@ sunk818就是这个意思。只要播放器支持,就会将字幕添加为可以启用或禁用的音轨。Hyde先生和Paul ffmpeg也可以在视频本身的顶部添加字幕,在这种情况下,您可以控制字体和位置。
Boushley '16

1
.srt文件必须与-c:s copy不一起导入-c:s mov_text
GetFree

82

注意:此解决方案“刻录字幕”到视频中,以便视频的每个观看者都将被强制看到它们。

使用该libass库(确保ffmpeg安装的配置中具有该库--enable-libass)。

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

ffmpeg -i subtitles.srt subtitles.ass

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

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

40
这会将它们“刻录到”视频中,这意味着您无法在播放器中将其关闭。这与将它们添加为字幕流不同,后者可以由播放器读取并在观众需要时显示。
stib 2014年

1
非常感谢您提供此解决方案。无论如何,有没有指定字符的大小?
user1319182 2015年

1
看一下这个答案: stackoverflow.com/questions/21363334/…。您可能需要在字幕文件本身中设置字体,否则使用字幕过滤器,您可以force_style设置字体: ffmpeg.org/ffmpeg-filters.html#subtitles-1
HdN8

在为Instagram之类的视频添加字幕时,这将非常有用。地方,比如Instagram的浏览器,用户没有听声音或视频是用另一种语言能力,那么用户可以读取字幕,而不是
ϻαϻɾΣɀО-MaMrEzO

1
安装libass扩展,如果用`容易更新Debian系统上缺少&&易于安装libass-dev的。”
Sopalajo德Arrierez

53

您正在尝试将字幕作为字幕流进行多路复用。这很容易,但是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

3
可以添加多个字幕吗?该软件订阅会被识别为未知语言吗?
帕特里克

1
是的。我刚刚对其进行了MKV测试:
dotokija

7
首先添加另一个输入:-i input2.srt。第二,将其映射为第二个流:-map 2:0。最后,为第二个字幕流选择编码器(与第一个相同):-c:s srt。完整示例\ ffmpeg -i input.mp4 -f srt -i input.srt -i input2.srt \ -map 0:0 -map 0:1 -map 1:0 -map 2:0 -c:v复制- c:复制\ -c:s srt -c:s srt output.mkv
dotokija 2016年

8
并添加语言元数据(在输出文件之前插入)“ -metadata:s:s:0 language = eng”
Patrick

当我将mkv文件重新打包为mp4文件(ffmpeg -i film.mkv -vcodec复制-acodec复制film.mp4)时,如何排除原始文件中的字幕?原始mkv具有字幕,但mp4格式的输出没有字幕。这是怎么回事?我做错了什么?
oldboy

9

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

参见维基页面容器格式比较


1
HV并不是很相关,欢迎您提供不止一种解决方案。
JasonXA 2015年

8

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


5

我尝试使用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文件。


3

我将提供一个简单通用的答案,该答案适用于任何数量的音频和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"

它将创建“带有字幕等的视频”。


-1

简单的例子:

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

仅替换linux变量


关心详细吗?
RamenChef

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.