如何在ffmpeg中设置字幕背景?

如何在ffmpeg中设置字幕背景?,ffmpeg,subtitle,Ffmpeg,Subtitle,它描述了如何将srt文件刻录到视频中。 然而,我想把一个半透明的背景字幕,使文本可以更容易阅读。我该怎么做呢?创建一个png,其中包含一个透明框和一个您喜欢的大小的alpha通道。您可以使用gimp或photoshop等 然后使用以下命令: ffmpeg -i video.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=10:10" \ -codec:a copy out.mp4 其中10:10是距左上角的距离 之后,您可以插入字幕。 AS

它描述了如何将srt文件刻录到视频中。
然而,我想把一个半透明的背景字幕,使文本可以更容易阅读。我该怎么做呢?

创建一个png,其中包含一个透明框和一个您喜欢的大小的alpha通道。您可以使用gimp或photoshop等

然后使用以下命令:

ffmpeg -i video.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=10:10" \
-codec:a copy out.mp4
其中10:10是距左上角的距离

之后,您可以插入字幕。

ASS字幕可以具有半透明的文本背景

与aegisub 最简单的方法是使用

  • 使用aegisub打开您的字幕文件
  • 单击
    Subtitle
    → <代码>样式管理器
  • 当前脚本下
    选择
    默认值
    ,然后按
    编辑
    按钮
  • 轮廓
    阴影
    值进行实验。选中不透明框
  • 颜色
    下,单击
    轮廓
    阴影
    下的颜色。将出现一个窗口。调整
    Alpha
    框的值以更改透明度
  • 将字幕另存为
    .ass
    文件
  • 现在,您可以使用AAS文件来创建

    没有aegisub 如果需要硬底壳,可以使用
    force\u style
    选项添加透明背景

    ffmpeg -i input -filter_complex "subtitles=subs.ass:force_style='OutlineColour=&H80000000,BorderStyle=3,Outline=1,Shadow=0,MarginV=20'" output
    
    • 这将适用于FFmpeg支持的任何基于文本的字幕,因为过滤器将自动将它们转换为ASS

    • 有关格式设置选项,请参见

    多行问题 如果您的字幕包含多行,由于自动换行或有意换行,背景将重叠,可能看起来很难看,如下所示:

    您可以通过以下方式避免这种情况:

  • 轮廓
    阴影
    大小更改为
    0
  • 阴影的alpha设置将控制背景框的透明度。单击阴影颜色以将阴影颜色的
    Alpha
    调整到所需的透明度级别
  • 在文本编辑器中编辑ASS文件。在
    Style
    行中,将与
    BorderStyle
    对应的值更改为
    4
    。这将填充每个字幕事件的边界框背景。示例
    样式
    行:

    Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H80000000,&H80000000,-1,0,0,0,100,100,0,0,4,0,0,2,10,10,10,1
    
  • 例如:

    请注意,
    BorderStyle=4
    是一个非标准值,因此它可能无法在所有播放器中正常工作。

    感谢和wm4的
    BorderStyle
    建议

    使用抽屉 可以使用创建背景框。 如果希望框跨越宽度,这可能很有用

    缺点是,对于长字幕,你必须考虑换行或换行。简单地将框加高以进行补偿就足够了,但会看起来很难看,因为字幕基线保持不变:单行字幕顶部的填充比底部的填充更多。

    您可以使用Aegisub脚本。该脚本自动为每行字幕生成透明背景

    backcolor=&h8000000
    表示有%50不透明黑色背景


    它是颜色的十六进制表示,AABBGGRR。

    对于当前版本的libass(0.15)和当前版本的ffmpeg(N-100402-g0320dab265,从源代码编译,可能与版本4.2相同),您可以使用此bash脚本

    INFILE="movie.mp4"
    SUBS="subtitles.srt"
    OUTFILE="result.mp4"
    ffmpeg -i "${INFILE}" -vf subtitles=${SUBS}:force_style='Borderstyle=4,Fontsize=16,BackColour=&H80000000'" "${OUTFILE}"
    
    将subtitles.srt刻录到movie.mp4并保存为result.mp4

    字幕将正确显示在50%透明矩形中,
    即使一个字幕有两行。

    如果是两行字幕,也会留下令人讨厌的一行。有没有办法摆脱ged?我不知道。另一种方法是使用制作一个静态、透明的盒子,但这也不是个好主意。@eusoubrasileiro好听。请注意“多条线可能重叠,看起来很难看”的问题。IIRC,这是libass的问题。某个地方有一个关于它的错误报告。@sup如果我没记错的话,它是在上的,但它当前处于关闭状态。@LordNeckbeard实际上,设置BorderStyle=4解决了这个问题(请参阅我打开的Github问题),请更新您的答案好吗?不过,它只适用于libass。如果您想使用“创建一个单独的背景框”方法,只使用过滤器会更简单、更有效。此外,使用过滤器,如叠加或drawbox,将需要重新编码视频,但如我的回答中所示,为SoftSub使用ASS字幕不会修改视频。
    ffmpeg -i input.mp4 -filter_complex "subtitles=input.srt:force_style='BackColour=&H80000000,BorderStyle=4,Fontsize=11'" output.mp4
    
    INFILE="movie.mp4"
    SUBS="subtitles.srt"
    OUTFILE="result.mp4"
    ffmpeg -i "${INFILE}" -vf subtitles=${SUBS}:force_style='Borderstyle=4,Fontsize=16,BackColour=&H80000000'" "${OUTFILE}"