我想在小尺寸视频上刻录字体尽可能小(可读)的字幕,如第一张图片所示。 FFmpeg使任何字体大小的字体模糊(第二张图像)。
ffmpeg -i in.jpg -vf "scale=160x128,subtitles=in.srt:force_style='OutlineColour=&H80000000,BorderStyle=3,Fontsize=15,Fontname=Silkscreen'" out.png
有没有什么办法可以使用FFmpeg或其他现成的命令行工具用小字体实现像素完美的字幕? (我发现的最小字体是Silkscreen,虽然它只是ASCII!)
答案 0 :(得分:1)
你可以通过在libass中启用字体提示来获得更好的结果,但是appears FFmpeg目前不支持设置此选项。请使用mpv:
进行尝试mpv in.jpg --vf=scale=160:128 --sub-file=in.srt --sub-ass-hinting=light --sub-font=Silkscreen --sub-font-size=54 --sub-back-color=0/0/0/0.5 --sub-color=1/1/1 --o=out.png
(如果您需要它还有--sub-ass-force-style=FontName=Silkscreen,etc.
或者只是喜欢直接使用ASS语法。)
您可以通过--sub-ass-hinting=normal
或--sub-ass-hinting=native
获得更好的运气,但价值light
为您提供了问题中图片的最佳结果。
这是我得到的:
(我在网上找到的源图像的宽高比为3:2,但你的例子是4:3。在左边,我必须使用--vf=scale=160:120,dsize=160:120
来匹配你的尺寸和宽高比。右边,我用--vf=scale=180:120
来匹配你的图像高度,但保持原始的宽高比。)
为了获得更好的结果,您可能需要调整字体大小,因为根据我的理解,所讨论的字体针对特定大小进行了优化。 ASS“字体大小”不是传统的字体大小(而是以像素为单位的上升和下降高度的总和),所以这不是完全无关紧要的,但是一些实验可能会让你在那里。
与您的旧方法相比,这也为您提供了一个更清晰的字幕周围/后面的框。当您使用BorderStyle=3
与目前的半透明OutlineColour
时,每行文字都有一个单独的框,这些框略有重叠;因此,您可以在每两行文本之间看到一个较暗/较强的颜色区域。对于你的尺码,这可能不是很明显,但如果你看起来足够坚硬,你会看到它。作为ASS格式的扩展,libass支持自定义BorderStyle=4
,它在整个文本周围生成一个单独的框。在mpv中设置--sub-back-color
时,会自动选择此项。 (如果同时出现多个文本,每个文本仍然有自己的框,框可能会重叠。但根据我的简短搜索,在SRT文件中这种情况似乎很少见。)是否要恢复为{{1我认为您需要添加BorderStyle=3
并将--sub-ass-force-style=BorderStyle=3
替换为--sub-back-color
。