FFMPeg:在图像中心旋转图像

FFMPeg:在图像中心旋转图像

我试图在视频的 X,Y 位置上叠加一张图片,然后将其旋转任意角度,其中 x,y = 150,100

但这并没有按预期发挥作用。

下面是我正在使用的命令。

ffmpeg -i input_video.mp4 -i crown.png -filter_complex“[1:v]格式=rgba,旋转=-30PI/180:ow='rotw(-30PI/180)':oh='roth(-30*PI/180)' [旋转];[0:v][旋转]覆盖=150:100" -codec:a copy sample.mp4

问题是它围绕角落而不是中间的一个点旋转。以下是图像示例:

下面显示了背景视频(网格)上的覆盖图(狗图像)。这是位于 150,100 处且旋转 0 度的正常图像。

在此处输入图片描述

现在将其旋转 -90 度应该会得到以下输出:**这是正确的预期输出**

在此处输入图片描述

但它实际上给出了输出:** 错误输出 **

在此处输入图片描述

看起来这是因为 FFMPEG 处理旋转的方式造成的,虽然我期望它绕中心旋转,但它却绕着一个角锚点旋转。我如何才能实现我需要的旋转?

答案1

为了保留中心,我们必须通过中心的移动来调整左上角的坐标(中心坐标由于旋转而移动):

ffmpeg -y -i input_video.mp4 -i crown.png -filter_complex "[1:v]format=rgba,rotate=-30*PI/180:ow='rotw(-30*PI/180)':oh='roth(-30*PI/180)':c=none[rotate];[0:v][rotate]overlay=150+(600-overlay_w)/2:100+(400-overlay_h)/2" -codec:a copy sample_fix.mp4

将 替换600为 的水平尺寸crown.png
将 替换400为 的垂直尺寸crown.png
注意:示例手动使用输入图像的宽度和高度。我们可以使用脚本自动执行该过程,该脚本将宽度和高度值提取到变量中(在执行 FFmpeg 之前),并在执行命令时使用这些变量。


计算旋转 90 度后的 x、y 调整的示例:

假设crown.png的分辨率是600x400。

      600
 -------------
|             |
|      x      | 400
|             |
 -------------
 Center coordinate before rotation:
 cx, cy = [(600-1)/2, (400-1)/2] = [(orig_w-1)/2, (orig_h-1)/2]

    600
 --------
|        | 
|        |
|   x    | 400
|        |
|        |
 --------
Center coordinate after rotation:
cx, cy = [(400-1)/2, (600-1)/2] = [(rot_w-1)/2, (rot_h-1)/2]

For keeping the center, we have to add the following offsets:
delta_cx, delta_cy = [(600-1)/2, (400-1)/2] - [(400-1)/2, (600-1)/2] = [100, -100]

Generally, we have to add the following offsets:
Horizontal offset: (orig_w-rot_w)/2
Vertical offset: (orig_h-rot_h)/2

测试:

创建分辨率为 600x400 的示例输入crown.png(用于测试):
ffmpeg -y -f lavfi -i testsrc=size=600x400:rate=1:duration=1 -update 1 crown.png

使用表格.png作为“主要”图像。

零旋转叠加:
ffmpeg -y -i table.png -i crown.png -filter_complex "[1:v]format=rgba,rotate=0*PI/180:ow='rotw(0*PI/180)':oh='roth(0*PI/180)':c=none[rotate];[0:v][rotate]overlay=150:100" -update 1 sample0.png

30 度旋转叠加:
ffmpeg -y -i table.png -i crown.png -filter_complex "[1:v]format=rgba,rotate=-30*PI/180:ow='rotw(-30*PI/180)':oh='roth(-30*PI/180)':c=none[rotate];[0:v][rotate]overlay=150+(600-overlay_w)/2:100+(400-overlay_h)/2" -update 1 sample30.png


输出:
sample0.pngsample30.png
在此处输入图片描述在此处输入图片描述

可以看到,旋转后的中心位置与未旋转时的中心位置相同。

相关内容