如何在ffmpeg中设置背景到副标题?

sup*_*rio 9 ffmpeg subtitle

这里描述如何将srt文件刻录到视频中.但是,我想在字幕中加入半透明背景,以便更容易阅读文本.我怎样才能做到这一点?

llo*_*gan 13

使用ASS字幕创建不透明的文本背景

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

随着aegisub

最简单的方法是使用aegisub.

在此输入图像描述

  1. 使用aegisub打开字幕文件.
  2. 单击SubtitleStyles manager.
  3. Current Script选择下Default,然后按Edit按钮.
  4. 试验OutlineShadow值.检查Opaque box.
  5. Colors点击下面的颜色OutlineShadows.将出现一个窗口.调整Alpha框的值以更改透明度.
  6. 将字幕保存为.ass文件.

现在您可以使用AAS文件制作hardsubs或softsubsffmpeg.

没有aegisub

如果你想要hardsubs你可以使用字幕过滤器添加透明背景与force_style选项.

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

  • 有关格式化选项,请参阅SubStation Alpha(ASS)样式字段.

多行问题

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

在此输入图像描述

您可以通过以下方式避免此

  1. 将大小OutlineShadow大小更改为0.
  2. 阴影的alpha设置将控制背景框的透明度.单击阴影颜色可将阴影颜色调整为Alpha所需的透明度级别.
  3. 在文本编辑器中编辑ASS文件.在Style线改变与相对应的值BorderStyle4.这将填充每个字幕事件的边界框背景.示例Style行:

    Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H80000000,&H80000000,-1,0,0,0,100,100,0,0,4,0,0,2,10,10,10,1
    
    Run Code Online (Sandbox Code Playgroud)

例:

在此输入图像描述

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

感谢supwm4BorderStyle建议.

使用drawbox

drawbox过滤器可用于创建一个背景框.如果您希望框跨越宽度,这可能很有用.

在此输入图像描述

ffmpeg -i input -filter_complex "drawbox=w=iw:h=24:y=ih-28:t=max:color=black@0.4,subtitles=subs.ass" output
Run Code Online (Sandbox Code Playgroud)

缺点是你需要为长字幕说明换行或自动换行.简单地使盒子更高以进行补偿就足够了,但是看起来很难看,因为字幕基线保持静止:单行字幕在顶部比底部有更多的填充.

  • 如果是双行字幕,这会留下令人讨厌的线条.有没有办法ged摆脱它? (2认同)
  • @eusoubrasileiro很高兴听到.请注意"多行可能重叠并且看起来很丑"的问题.IIRC,这是libass的一个问题.有一个关于它的错误报告. (2认同)

Equ*_*nox 4

创建一个带有透明框和您喜欢的尺寸的 Alpha 通道的 png。您可以使用gimp 或photoshop。

然后使用这个命令:

ffmpeg -i video.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=10:10" \
-codec:a copy out.mp4
Run Code Online (Sandbox Code Playgroud)

其中 10:10 是距左上角的距离。

之后您可以插入字幕。