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


当前回答

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

其他回答

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

如果你的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

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

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

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

您正在尝试将字幕合并为字幕流。这很简单,但是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

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

Ffmpeg -i输入。M4v -i输入。SRT -vcodec copy -acodec copy -scodec copy -map 0:0 -map 0:1 -map 1:0 -y output.mkv

像你一样,我必须使用MKV输出文件-我不能创建一个M4V文件。