FFmpeg实现图片以自身中心旋转后叠加到视频指定位置的问题
FFmpeg实现图片以自身中心旋转后叠加到视频指定位置的问题
我太懂你现在的困扰啦——想用FFmpeg把图片叠加到视频的(150,100)位置,还得让图片绕自己的中心旋转任意角度,但目前的命令执行后,图片居然是绕着角落转的,完全不是你想要的效果对吧?
先看看你之前用的命令:
ffmpeg -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)' [rotate];[0:v][rotate] overlay=150:100" -codec:a copy sample.mp4
问题就出在rotate滤镜的默认旋转锚点上,它默认是以图片的左上角(0,0点)为中心旋转的,所以旋转后图片的位置直接跑偏,完全不符合你预期的叠加坐标。
解决方法:调整旋转锚点+修正叠加偏移
要让图片绕自身中心旋转,得在rotate滤镜里指定旋转中心为图片的中点,同时因为旋转后图片的边界会变大,叠加时还要补上偏移量,确保旋转后的图片中心依然精准落在(150,100)位置。
修正后的命令如下:
ffmpeg -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)':cx='iw/2':cy='ih/2'[rotate];[0:v][rotate]overlay=x='150-(ow-iw)/2':y='100-(oh-ih)/2'" -codec:a copy sample.mp4
关键修改点解释:
cx='iw/2':cy='ih/2':这部分是告诉rotate滤镜,以图片自身的中心(宽度的一半、高度的一半)作为旋转锚点,这样图片旋转时就会绕自己的中心转啦。overlay=x='150-(ow-iw)/2':y='100-(oh-ih)/2':因为旋转后的图片宽度(ow)和高度(oh)会比原图片大(比如旋转非90/180倍数角度时),所以需要把叠加的X、Y坐标调整,减去旋转后新增的宽度/高度的一半,这样旋转后的图片中心才能精准落在你指定的(150,100)位置。
效果对比说明:
- 正常无旋转时:图片的中心正好落在视频的(150,100)位置,就像你展示的那样——狗狗图片叠加在网格视频的对应坐标上,位置准确。
- 旋转-90度后:狗狗图片会绕自身中心旋转90度,并且旋转后的图片中心依然保持在(150,100),和你预期的正确输出完全一致。
备注:内容来源于stack exchange,提问作者Aneesh
相关产品推荐
相关产品推荐

