如何修改FFmpeg命令实现叠加图像绕自身中心旋转且位置正确?
我正在用FFmpeg对视频做图像缩放、旋转及叠加操作,能将图像旋转到指定角度,但叠加后的位置在垂直和水平方向都偏离了预期。
以下是我试过的命令及对应输出,命令1能得到预期效果,命令2和3无法实现。请问如何通用地修改命令,使叠加图像围绕自身中心旋转以得到预期输出?
命令及效果
命令1(正常效果)

ffmpeg -i graphpaper.mp4 -i arrow.png -y -filter_complex [1:v]scale=w=364:h=370[overlay0];[overlay0]rotate=a=0:c=none:ow=rotw(0):oh=roth(0)[rotate0];[0:v][rotate0]overlay=x=419:y=168[output0] -map [output0] sample-overlay-on-graph-paper.mp4
命令2(位置偏离)

ffmpeg -i graphpaper.mp4 -i arrow.png -y -filter_complex [1:v]scale=w=364:h=370[overlay0];[overlay0]rotate=a=0.8017360589297406:c=none:ow=rotw(0.8017360589297406):oh=roth(0.8017360589297406)[rotate0];[0:v][rotate0]overlay=x=419:y=168[output0] -map [output0] sample-overlay-on-graph-paper.mp4
命令3(位置偏离)

ffmpeg -i graphpaper.mp4 -i arrow.png -y -filter_complex [1:v]scale=w=364:h=370[overlay0];[overlay0]rotate=a=5.493783719179012:c=none:ow=rotw(5.493783719179012):oh=roth(5.493783719179012)[rotate0];[0:v][rotate0]overlay=x=419:y=168[output0] -map [output0] sample-overlay-on-graph-paper.mp4
输入文件:
- graphpaper.mp4(网格视频)
- arrow.png(箭头图片)
问题核心是:旋转后图像的画布尺寸会扩大以容纳旋转后的图像,但你仍用原图像的锚点位置叠加,导致中心偏移。
通用修改思路:计算旋转后画布与原图像的尺寸差,用目标叠加位置减去这个差值的一半,让图像中心对齐到预期坐标。
通用命令模板
ffmpeg -i graphpaper.mp4 -i arrow.png -y -filter_complex \ "[1:v]scale=w=364:h=370[scaled]; \ [scaled]rotate=a=旋转弧度:c=none:ow=rotw(旋转弧度):oh=roth(旋转弧度)[rotated]; \ [0:v][rotated]overlay=x=419-(rotw(旋转弧度)-364)/2:y=168-(roth(旋转弧度)-370)/2[output]" \ -map [output] sample-overlay-on-graph-paper.mp4
命令2修改示例
ffmpeg -i graphpaper.mp4 -i arrow.png -y -filter_complex \ "[1:v]scale=w=364:h=370[scaled]; \ [scaled]rotate=a=0.8017360589297406:c=none:ow=rotw(0.8017360589297406):oh=roth(0.8017360589297406)[rotated]; \ [0:v][rotated]overlay=x=419-(rotw(0.8017360589297406)-364)/2:y=168-(roth(0.8017360589297406)-370)/2[output]" \ -map [output] sample-overlay-on-graph-paper.mp4
原理说明
rotw(旋转弧度)/roth(旋转弧度):自动计算旋转后画布的宽高(rotw(旋转弧度)-364)/2:旋转后图像在新画布中水平偏移的一半,用目标x坐标减去这个值,确保图像中心对齐预期x位置(roth(旋转弧度)-370)/2:同理修正垂直方向的偏移
无论旋转多少角度,按此修改后,叠加图像都会围绕自身中心对齐到你设定的x=419,y=168位置。
内容的提问来源于stack exchange,提问作者ktrace

