Ffmpeg 为小视频呈现像素级完美字幕

Ffmpeg 为小视频呈现像素级完美字幕,ffmpeg,subtitle,Ffmpeg,Subtitle,我想在一个小尺寸的视频上刻录尽可能小(但可读)的字体的字幕,如第一张图片所示。FFmpeg使任何字体大小的字体变得模糊(第二幅图像) 是否有任何方法可以使用FFmpeg或其他现成的命令行工具实现小字体的像素完美字幕?(我发现的最小字体是,尽管它只有ASCII码!) 通过在libass中启用字体提示,您可以获得更好的效果,但FFmpeg目前不支持设置此选项。尝试以下方法: (如果您需要,或者只想直接使用ass语法,还可以使用--sub-ass-force-style=FontName=Silks

我想在一个小尺寸的视频上刻录尽可能小(但可读)的字体的字幕,如第一张图片所示。FFmpeg使任何字体大小的字体变得模糊(第二幅图像)

是否有任何方法可以使用FFmpeg或其他现成的命令行工具实现小字体的像素完美字幕?(我发现的最小字体是,尽管它只有ASCII码!)


通过在libass中启用字体提示,您可以获得更好的效果,但FFmpeg目前不支持设置此选项。尝试以下方法:

(如果您需要,或者只想直接使用ass语法,还可以使用
--sub-ass-force-style=FontName=Silkscreen等。)

您可能在
--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“字体大小”不是以点为单位的传统字体大小(而是以像素为单位的上升高度和下降高度之和),因此这并不完全是微不足道的,但一点实验可能会让你达到这一点


与旧方法相比,这也为字幕周围/后面提供了一个更干净的方框。当使用半透明的
OutlineColor
使用
BorderStyle=3
时,就像您当前使用的那样,每行文本都有一个单独的框,这些框稍微重叠;因此,您可以在每两行文本之间看到一个颜色较深/较强烈的薄区域。这可能不是很明显,在你的尺寸,但你会看到它,如果你看得足够努力。作为ASS格式的扩展,libass支持自定义
BorderStyle=4
,它在整个文本周围生成一个框。在mpv中设置
--子背景颜色时,它会自动选择此选项。(如果多个文本同时出现,每个文本仍将有自己的框,框可能会重叠。但根据我的简短搜索,这种情况在SRT文件中似乎很少见。)是否要恢复到
BorderStyle=3
,我认为您需要添加
--sub-ass-force-style=BorderStyle=3
并将
--sub-back-color
替换为
--sub-border-color

有帮助吗?光栅化是由libass完成的,而不是由ffmpeg和AFAICT完成的,抗锯齿不能被跳过。还要注意,抗锯齿不应使事情变得不可读(从理论上讲,它不是这样做的),除非wrong@MarcusMüller:在非常小的字体上进行抗锯齿会破坏它。我看不出有什么办法可以绕过它。值得一提的是,尽管我没有遵循该库的开发。一个解决办法可能是在大的透明画布上渲染字幕,然后缩小它的比例并覆盖在小视频上。
ffmpeg -i in.jpg -vf "scale=160x128,subtitles=in.srt:force_style='OutlineColour=&H80000000,BorderStyle=3,Fontsize=15,Fontname=Silkscreen'" out.png
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