使用ffmpeg添加文本字幕

0-a*_*pha 100 mp4 ffmpeg subtitle srt

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

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mp4
Run Code Online (Sandbox Code Playgroud)

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

流映射的数量必须与输出流的数量匹配.

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

ffmpeg -i input.mp4 -i input.srt -map 0.0 -map 0.1 -map 1.0 output.mkv
Run Code Online (Sandbox Code Playgroud)

它正确地映射了流,但是给出了一个错误:

未找到输出流#0.2的编码器(编解码器ID 94210)

当我发射

ffmpeg -codecs
Run Code Online (Sandbox Code Playgroud)

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

小智 148

ffmpeg -i infile.mp4 -i infile.srt -c copy -c:s mov_text outfile.mp4
Run Code Online (Sandbox Code Playgroud)

-vf subtitles=infile.srt 将无法使用 -c copy


顺序-c copy -c:s mov_text很重要.你在告诉FFmpeg:

  1. 视频:copy,Audio:copy,Subtitle:copy
  2. 副标题:mov_text

如果你颠倒它们,你会告诉FFmpeg:

  1. 副标题:mov_text
  2. 视频:copy,Audio:copy,Subtitle:copy

或者,您可以-c:v copy -c:a copy -c:s mov_text按任何顺序使用.

  • 此方法将字幕添加到文件中作为流之一,因此需要播放器支持才能显示字幕(如VLC) (12认同)
  • 是的,@ sunk818就是这个意思.这会将字幕添加为可以启用或禁用的轨道,只要播放器支持它即可.Hyde先生和Paul ffmpeg先生也可以在视频本身的顶部添加字幕,在这种情况下,您可以控制字体和定位等内容. (2认同)
  • .srt 文件必须使用 `-c:s copy` 而不是 `-c:s mov_text` 导入。 (2认同)

HdN*_*dN8 59

使用该libass库(确保您的ffmpeg安装在配置中具有库--enable-libass).

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

ffmpeg -i subtitles.srt subtitles.ass
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -i mymovie.mp4 -vf ass=subtitles.ass mysubtitledmovie.mp4
Run Code Online (Sandbox Code Playgroud)

  • 这将"刻录"到视频中,这意味着你无法在播放器中关闭它们.这与将它们添加为字幕流不同,可以由播放器读取并在观众需要时显示. (33认同)
  • 呵呵呵呵`.ass` (16认同)
  • 非常感谢这个解决方案。无论如何要指定字符的大小? (4认同)
  • 值得注意的是,您可以一步完成此操作:“ffmpeg -i mymovie.mp4 -vf subtitles=subtitles.srt mysubtitledmovie.mp4”。不过,您仍然需要使用“libass”编译“ffmpeg”。 (3认同)

dot*_*ija 49

您正在尝试将字幕复制为字幕流.这很容易,但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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 首先添加另一个输入:-i input2.srt.其次,将其映射为第二个流:-map 2:0.最后,为第二个字幕流选择编码器(与第一个字幕流相同): - c:s srt.完整示例\ ffmpeg -i input.mp4 -f srt -i input.srt -i input2.srt\-map 0:0 -map 0:1 -map 1:0 -map 2:0 -c:v copy - c:副本\ -c:s srt -c:s srt output.mkv (7认同)
  • 并添加语言元数据(在输出文件之前插入)" - cosadata:s:s:0 language = eng" (7认同)
  • 是否可以添加多个副标题?这个softsub会被认为是未知的语言吗? (2认同)
  • @user136036如果您不使用映射,那么添加额外的字幕将覆盖现有的字幕。 (2认同)

kha*_*han 8

MKV容器支持视频和音频编解码器几乎任何东西,也支持字幕和DVD菜单.因此,您只需将编解码器从输入视频复制到带有字幕的MKV容器输出视频.首先,您应该将SRT转换为ASS字幕格式

ffmpeg -i input.srt input.ass
Run Code Online (Sandbox Code Playgroud)

并将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
Run Code Online (Sandbox Code Playgroud)

也使用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
Run Code Online (Sandbox Code Playgroud)

查看wiki页面容器格式的比较


Mir*_*emm 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


cdl*_*dlv 6

我将提供一个简单而通用的答案,适用于任意数量的音频和srt字幕,并尊重可能包括mkv容器的元数据。因此,它甚至会添加 matroska 可能包含的图像作为附件(尽管不是其他类型的 AFAIK)并将它们转换为曲目;你将无法观看,但它们会在那里(你可以将它们解复用)。啊,如果mkv有章节,mp4也有。

ffmpeg -i <mkv-input> -c copy -map 0 -c:s mov_text <mp4-output>
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这一切都与 , 相关-map 0,它告诉FFmpeg添加所有轨道,包括元数据、章节、附件等​​。如果存在无法识别的“轨道”(mkv允许附加任何类型的文件),它将以错误结束。

mkv2mp4.bat如果您经常这样做,您可以创建一个简单的批处理来创建与mkv名称相同的mp4。如果有错误控制、不同的输出名称等会更好,但你明白了。

@ffmpeg -i %1 -c copy -map 0 -c:s mov_text "%~n1.mp4"
Run Code Online (Sandbox Code Playgroud)

现在你可以简单地运行

mkv2mp4 "Video with subtitles etc.mkv"
Run Code Online (Sandbox Code Playgroud)

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


D C*_*zee 5

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