我试图使用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 -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4
vf字幕= infile。SRT对-c copy无效
-c copy -c:s mov_text的顺序很重要。你告诉FFmpeg:
视频:拷贝,音频:拷贝,字幕:拷贝
副标题:mov_text
如果你反转它们,你是在告诉FFmpeg:
副标题:mov_text
视频:拷贝,音频:拷贝,字幕:拷贝
或者你也可以使用-c:v copy -c:a copy -c:s mov_text in any
秩序。
我将提供一个简单而一般的答案,适用于任何数量的音频和srt字幕,并尊重可能包括mkv容器的元数据。因此,它甚至会添加图像matroska可能包括作为附件(虽然不是另一种类型的AFAIK),并将它们转换为轨道;你将无法观看,但他们会在那里(你可以demux他们)。啊,如果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”,其中包括最大的信息。
注意:此解决方案将字幕添加到视频作为一个单独的可选(和用户控制)字幕轨道。
ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4
vf字幕= infile。SRT对-c copy无效
-c copy -c:s mov_text的顺序很重要。你告诉FFmpeg:
视频:拷贝,音频:拷贝,字幕:拷贝
副标题:mov_text
如果你反转它们,你是在告诉FFmpeg:
副标题:mov_text
视频:拷贝,音频:拷贝,字幕:拷贝
或者你也可以使用-c:v copy -c:a copy -c:s mov_text in any
秩序。
注意:这个解决方案将字幕“烧录”到视频中,这样视频的每个观众都将被迫看到它们。
如果你的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