使用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:
- video:复制,audio:复制,副标题:复制
- 字幕:mov_text
如果你反转他们,你告诉FFmpeg:
- 字幕:mov_text
- 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