使用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
相关产品推荐
相关产品推荐

