这里描述了如何将srt文件烧录到视频中,详情请查看此处。然而,我想给字幕添加一个半透明的背景,使文本更容易阅读。请问如何实现?
ASS字幕可以为文本设置半透明背景。
最简单的方法是使用aegisub。
Subtitle
→ Styles manager
。Current Script
中选择 Default
,然后按下 Edit
按钮。Outline
和 Shadow
值。勾选 Opaque box
。Colors
下点击 Outline
或 Shadows
下的颜色。会出现一个窗口。调整 Alpha
框的值以更改透明度。.ass
文件。现在,您可以使用AAS文件使用 ffmpeg 创建硬字幕或软字幕。
如果您想要硬字幕,可以使用 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)样式字段。
如果您的字幕包含多行,由于长行自动换行或故意换行,背景可能会重叠并且看起来很难看,如下所示:
您可以通过以下方式避免这种情况:
Outline
and Shadow
sizes to 0
.Alpha
of the shadow color to your desired transparency level.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
是非标准值,因此可能无法在所有播放器中正常工作。
感谢sup和wm4提供BorderStyle
建议。
可以使用drawbox过滤器创建背景框。如果您希望框跨越整个宽度,则可能会有用。
ffmpeg -i input -filter_complex "drawbox=w=iw:h=24:y=ih-28:t=max:color=black@0.4,subtitles=subs.ass" output
缺点是在长字幕中必须考虑换行或单词换行。简单地使框变高以进行补偿就足够了,但看起来很丑,因为字幕基线保持不变:单行字幕在顶部比底部有更多的填充。
ffmpeg -i video.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=10:10" \
-codec:a copy out.mp4
其中10:10是距离左上角的距离。
之后,您可以插入您的字幕。
ffmpeg -i input.mp4 -filter_complex "subtitles=input.srt:force_style='BackColour=&H80000000,BorderStyle=4,Fontsize=11'" output.mp4
BackColour=&H80000000
表示具有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}"
将字幕文件.srt烧录到电影.mp4中,并将其保存为result.mp4。
即使字幕有两行,字幕也会以50%透明度的矩形正确显示。