You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MoviePy沿半圆弧路径排布展示GIF视频片段的问题咨询

MoviePy 多GIF沿视频中心半圆弧叠加实现方案

你现有代码存在三个核心逻辑错误,会直接导致效果不符合预期:

  • 点位计算错误:当前定义的positions所有点位x坐标固定为200,是垂直竖线排布,完全不符合半圆弧的坐标规则
  • 合成接口用错:concatenate_videoclips的作用是将多个视频片段按时间先后拼接,不是多图层叠加,图层叠加必须使用CompositeVideoClip
  • 格式冗余:set_position直接接收(x,y)格式的元组即可,不需要给单个坐标额外套一层列表

实现逻辑

半圆弧排布的核心是按图标数量均分圆弧角度,以视频画面中心为圆心、固定值为半径,通过三角函数计算每个图标的落点坐标;计算坐标时需要减去GIF自身宽高的一半,保证图标中心对齐圆弧路径,而非图标左上角对齐。

可直接运行的参考代码

import math
from moviepy.editor import VideoFileClip, CompositeVideoClip

# 基础参数配置
base_video = VideoFileClip("基础视频文件路径.mp4")
VIDEO_WIDTH, VIDEO_HEIGHT = base_video.size
GIF_NUM = 7  # 按需修改为6即可适配6个GIF的场景
ARC_RADIUS = 320  # 半圆弧半径,数值越大圆弧越靠近画面边缘
GIF_LIST = [f"{DIRECTORY}{wd}.gif" for wd in 你的GIF文件名列表] # 替换为你自己的GIF文件名列表

clips_layer = [base_video]  # 第一层放入基础视频作为底图

# 加载所有GIF并计算对应圆弧位置
center_x = VIDEO_WIDTH // 2
center_y = VIDEO_HEIGHT // 2
for idx, gif_path in enumerate(GIF_LIST):
    gif_clip = VideoFileClip(gif_path)
    # 统一GIF时长和起始时间,和基础视频对齐
    gif_clip = gif_clip.set_duration(base_video.duration).set_start(0)
    gw, gh = gif_clip.size
    
    # 均分上半圆弧角度(弧度制,范围从π到0对应180°到0°,即上半圆弧)
    angle = math.pi - idx * (math.pi / (GIF_NUM - 1))
    # 计算坐标,偏移半宽半高让图标中心落在圆弧上
    pos_x = center_x + ARC_RADIUS * math.cos(angle) - gw // 2
    pos_y = center_y - ARC_RADIUS * math.sin(angle) - gh // 2
    # 若需要下半圆弧排布,将上一行pos_y计算式中的减号改为加号即可
    
    gif_clip = gif_clip.set_position((pos_x, pos_y))
    clips_layer.append(gif_clip)

# 多图层合成最终视频
final_clip = CompositeVideoClip(clips_layer, size=base_video.size)
final_clip.write_videofile("输出结果.mp4", codec="libx264", audio_codec="aac")

可调项说明

  • 圆弧大小:修改ARC_RADIUS参数即可调整圆弧覆盖范围,建议根据视频分辨率调试,1080P视频常用值为250-400
  • 圆弧方向:除了上/下半圆弧,调整角度计算范围即可实现左/右竖半圆弧、任意角度圆弧的排布
  • 图标尺寸:如果各GIF大小不统一,加载GIF时可调用.resize((目标宽, 目标高))统一尺寸,排布效果更整齐

内容的提问来源于stack exchange,提问作者stooicrealism

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 00:18:20