我试图在视频的 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
可以看到,旋转后的中心位置与未旋转时的中心位置相同。