使用ffmpeg添加文本字幕

时间:2011-12-29 20:04:38

标签: ffmpeg mp4 subtitle srt

我正在尝试使用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编码是用什么的,以及我是需要打开它还是单独编译。

9 个答案:

答案 0 :(得分:136)

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. 视频:copy,Audio:copy,Subtitle:copy
  2. 字幕:mov_text
  3. 如果你反转它们,你会告诉FFmpeg:

    1. 字幕:mov_text
    2. 视频:copy,Audio:copy,Subtitle:copy
    3. 或者你可以在任何地方使用-c:v copy -c:a copy -c:s mov_text 顺序。

答案 1 :(得分:47)

使用libass库(确保您的ffmpeg安装包含配置--enable-libass中的库)。

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

ffmpeg -i subtitles.srt subtitles.ass

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

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

答案 2 :(得分:44)

您正在尝试将字幕作为字幕流进行复制。这很容易,但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 :(得分:7)

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页面Comparison of container formats

答案 4 :(得分:6)

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 :(得分:4)

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

答案 6 :(得分:2)

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

它将创建“带字幕的视频等.mp4”,其中包含最多的信息。

答案 7 :(得分:-1)

简单示例:

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

只替换linux变量

答案 8 :(得分:-3)

这就是为什么mkv是如此优秀的容器,特别是现在已经成熟了:

mkvmerge -o output.mkv video.mp4 subtitle.srt