我试图将图像叠加在视频的 X,Y 位置,然后将其旋转任意角度,其中 x,y = 150,100
然而,这并没有按预期工作。
下面是我正在使用的命令。
ffmpeg -i input_video.mp4 -i Crown.png -filter_complex "[1:v]format=rgba, 旋转=-30 PI/180:ow='rotw(-30 PI/180)':oh='roth(- 30*PI/180)' [旋转];[0:v][旋转]覆盖=150:100" -编解码器:复制sample.mp4
问题是它绕角上的点而不是中间的点旋转。以图像为例:
下面显示了背景视频(网格)顶部的叠加层(狗图像)。这是位于 150,100 且旋转 0 度的正常图像。
现在将其旋转 -90 度应给出以下输出:**这是正确的预期输出**
但它实际上给出了输出:**错误的输出**
看起来发生这种情况是因为 FFMPEG 处理旋转的方式,而我期望它绕中心旋转,它绕角锚点之一旋转。我怎样才能在这里实现我需要的轮换?
为了保留中心,我们必须通过中心的移动来调整左上角坐标(中心坐标由于旋转而移动):
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。
测试:
创建分辨率为 600x400 的示例输入
crown.png
(用于测试):ffmpeg -y -f lavfi -i testsrc=size=600x400:rate=1:duration=1 -update 1 crown.png
使用table.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.png
和sample30.png
:我们可以看到,旋转后的中心位置与没有旋转的中心位置相同。