使用ffmpeg添加文本字幕

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

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

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

stream映射的数量必须匹配输出stream的数量。

如果我尝试将mp4更改为mkv(尽pipemp4支持文本字幕),如下所示:

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

它正确映射的stream,但给出了一个错误:

未find输出stream#0.2的编码器(编解码器ID为94210)

当我启动

 ffmpeg -codecs 

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

 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. video:复制,audio:复制,副标题:复制
  2. 字幕:mov_text

如果你反转他们,你告诉FFmpeg:

  1. 字幕:mov_text
  2. video:复制,audio:复制,副标题:复制

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

使用libass库(确保你的ffmpeg install在configuration–enable-libass中有库)。

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

 ffmpeg -i subtitles.srt subtitles.ass 

然后使用videofilter添加它们:

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

您正试图将字幕作为字幕stream进行复用。 这很容易,但不同的语法是用于MP4(或M4V)和MKV。 在这两种情况下,您必须指定video和audio编解码器,或者只需要添加字幕即可复制stream。

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 

MKV容器支持video和audio编解码器几乎任何东西,也支持字幕和DVD菜单。 所以你可以从input的video复制编解码器输出带有字幕的MKV容器的video。 首先你应该将SRT转换为ASS字幕格式

 ffmpeg -i input.srt input.ass 

并将ASS字幕embedded到video中

 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页面容器格式比较

ffmpeg支持mov_text字幕编码器,它是MP4容器中支持的mov_text字幕编码器,可通过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

我尝试使用MP4Box来完成这个任务,但它无法处理我正在处理的M4V。 我用下面的命令行成功地将SRT作为软字幕与ffmpeg一起embedded:

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输出文件 – 我无法创build一个M4V文件。

简单的例子:

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

只能replacelinuxvariables

这就是为什么mkv是一个很好的容器,特别是现在已经很成熟了:

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