如何在ffmpeg中根据分辨率比例设置drawtext字体大小

7

如何根据不同分辨率的宽度和高度以一定比例设置视频上drawtext的字体大小?

ffmpeg -i Input.mp4 -vf drawtext="fontfile=OpenSans-Regular.ttf: \
text='New Music Video': fontcolor=white: fontsize=?: r=25: box=1: boxcolor=black@0.3: \ boxborderw=3: x=(20)/2: y=(h-text_h-20) " Output.mp4

我提出这个问题是因为当我将字体大小设置为24 fontsize=24 时,例如在其他分辨率下转换后它的大小会有所不同。


1
“fontsize”目前不支持表达式,只支持整数值。除非您想进行补丁修复,否则请确定所需的大小并将其传递给“ffmpeg”命令。 - aergistal
这个hack的方法是在透明背景上绘制文本,然后使用scale2ref调整文本大小,最后覆盖它。 - Gyan
@Mulvya,你能给我提供一个示例代码或任何例子吗?如何在透明背景上绘制文本? - Parsa Saei
@Mulvya,似乎无法像您所说的那样工作,因为当您更改背景大小时,文本大小不会改变。并且一些文本字符会褪色,因为只有背景框的大小减小了。 - Parsa Saei
我现在很忙,稍后可以提供一个命令,但基本流程是:1)创建透明背景;2)在背景上绘制文本;3)使用scale2ref调整带有文本的背景的大小。 - Gyan
2个回答

7
自ffmpeg版本3.4起,视频过滤器drawtext支持在其fontsize参数中使用算术表达式,例如将高度除以30:

-vf drawtext="fontsize=(h/30): x=(w-text_w)/2: y=(h-text_h*2): text='Hello, World!': fontcolor=white: box=1: boxcolor=black@0.5: boxborderw=5"

这将在720p视频上使用24号字体大小,在1080p视频上使用36号字体大小。

另请参见ffmpeg文档中如何使用drawtext滤镜的更多示例


6

我曾经也面临过这个问题,下面是我的解决方案:使用不同分辨率的对角线比例,缩放文本大小

具体步骤如下:

  1. 在你最常用的分辨率下找到一个合适的文本大小。例如,在分辨率为1920*1080下,textsize=65。
  2. 将目标视频的分辨率对角线长度除以1920*1080的对角线长度,然后乘以你合适的文本大小(65),得出的结果就是你需要的文本大小。

以下是Kotlin代码:

(Math.sqrt((videoWidth*videoWidth + videoHeight*videoHeight).toDouble()) / 2203 * textsize).toInt()

3
在这段代码中,2203是你找到的位置吗?@Rabbit - axita.savani
1
这是对角线尺寸。 - Richard Barber

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