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

20

这里描述了如何将srt文件烧录到视频中,详情请查看此处。然而,我想给字幕添加一个半透明的背景,使文本更容易阅读。请问如何实现?

5个回答

39

使用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文件使用 ffmpeg 创建硬字幕或软字幕

不使用aegisub

如果您想要硬字幕,可以使用 subtitles filter 并使用 force_style 选项添加透明背景。

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

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

多行字幕问题

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

enter image description here

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

  1. Changing the Outline and Shadow sizes to 0.
  2. The alpha settings of the shadow will control the transparency of the background box. Click on the shadow color to adjust the Alpha of the shadow color to your desired transparency level.
  3. Edit the ASS file in a text editor. In the Style line change the value corresponding with BorderStyle to 4. This will fill the bounding box background of each subtitle event. Example Style line:

    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是非标准值,因此可能无法在所有播放器中正常工作。

感谢supwm4提供BorderStyle建议。

使用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

缺点是在长字幕中必须考虑换行或单词换行。简单地使框变高以进行补偿就足够了,但看起来很丑,因为字幕基线保持不变:单行字幕在顶部比底部有更多的填充。


2
这会在两行字幕的情况下留下一条不好看的线。有没有办法去掉它? - sup
2
@eusoubrasileiro 很高兴听到这个消息。只是要注意“多行可能重叠并且看起来很丑”的问题。如果我没记错的话,这是libass的一个问题。有一个关于它的错误报告在某个地方。 - llogan
1
如果我没记错的话,它是在Aegisub Bug Tracker上发布的,但现在该网站已经无法访问了。 - llogan
1
@LordNeckbeard 实际上,将BorderStyle设置为4可以解决这个问题(请参见我打开的Github问题),您能否更新您的答案?但它只适用于libass。 - sup
1
@sup 已更新。感谢你的提示。 - llogan
显示剩余11条评论

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

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

之后,您可以插入您的字幕。


如果您想使用“制作单独的背景框”方法,那么只需使用drawbox过滤器会更容易和高效。此外,使用过滤器(如叠加或drawbox)需要重新编码视频,但是使用我的答案中所示的ASS字幕软字幕不会修改视频。 - llogan

2
ffmpeg -i input.mp4 -filter_complex "subtitles=input.srt:force_style='BackColour=&H80000000,BorderStyle=4,Fontsize=11'" output.mp4

BackColour=&H80000000 表示具有50%不透明度的黑色背景。

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


1
我在哪里可以获取像'H80000000'这样的颜色代码?我不能说“红色,绿色,黑色......等等”吗? - cis

1

使用当前版本的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}"

将字幕文件.srt烧录到电影.mp4中,并将其保存为result.mp4。

即使字幕有两行,字幕也会以50%透明度的矩形正确显示。


0

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

Subtitle transparent background


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接