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

MoviePy实现1080P视频中文本精准定位的正确方法

问题描述

我有一段1920×1080分辨率的全高清视频片段,片段带有背景图片,需要在上面添加两行文本。要求所有文本水平居中,第一行垂直居中于画面的上半区域,第二行垂直居中于画面的下半区域。我编写了如下代码,但文本的定位效果不符合预期,怀疑是TextClip的相对位置设置出了问题,寻求正确的实现方案:

image_clip = ImageClip("background_image.png", duration=4)

one_text = TextClip("One text".encode('utf-8'), fontsize=250, color='MediumGoldenRod', font="Arial-Unicode-MS")
start_x = 1920/2 - one_text.size[0]/2
start_y = 1080/2 - one_text.size[1] - 100
character_word = one_text.set_pos(('center','center')).set_position((start_x, start_y))

two_text = TextClip("Two Text".encode('utf-8'), fontsize=250, color='MediumGoldenRod', font="Arial-Unicode-MS")
start_x = 1920/2 - two_text.size[0]/2
start_y = 1080/2 - two_text.size[1] - 100
character_word = two_text.set_pos(('center','center')).set_position((start_x, start_y))

current_clip = CompositeVideoClip([image_clip,one_text,two_text])
问题根源

你的代码存在两个核心问题:

  • 同时调用set_pos(('center','center'))和set_position((start_x, start_y)),后者会直接覆盖前者的位置设置,导致定位逻辑混乱;
  • 手动计算的start_y数值逻辑错误,没有对应上半区、下半区的垂直居中位置。
正确实现方案

直接使用MoviePy的相对位置参数来设置,无需手动计算像素坐标,简洁又可靠:

from moviepy.editor import ImageClip, TextClip, CompositeVideoClip

# 加载背景图并设置时长
image_clip = ImageClip("background_image.png", duration=4)

# 第一行文本:水平居中,垂直居中于上半区域
one_text = TextClip("One text", fontsize=250, color='MediumGoldenRod', font="Arial-Unicode-MS")
# relative=True表示用比例定位,0.25是上半区(0-0.5范围)的垂直中心
one_text = one_text.set_pos(('center', 0.25), relative=True)

# 第二行文本:水平居中,垂直居中于下半区域
two_text = TextClip("Two Text", fontsize=250, color='MediumGoldenRod', font="Arial-Unicode-MS")
# 0.75是下半区(0.5-1范围)的垂直中心
two_text = two_text.set_pos(('center', 0.75), relative=True)

# 合成最终视频
current_clip = CompositeVideoClip([image_clip, one_text, two_text])

# 如需输出视频,添加以下代码(根据需求调整参数)
# current_clip.write_videofile("output.mp4", codec="libx264", fps=24)

补充说明

  • 当relative=True时,位置参数的数值是相对于画面尺寸的比例(0代表顶部/左侧,1代表底部/右侧),0.25刚好对应上半区域的垂直中点,0.75对应下半区域的垂直中点;
  • 不需要手动计算文本的像素偏移,MoviePy会自动处理水平居中的逻辑;
  • 如果你需要更精细的偏移控制,也可以用动态位置的方式,比如:
# 第一行文本:垂直居中于上半区的另一种写法
one_text = one_text.set_pos(('center', lambda t: (image_clip.h / 2) / 2 - one_text.h / 2))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:08:28