使用moviepy给视频添加中文水印不显示问题记录
背景: 在使用 moviepy 的 TextClip 给视频添加中文水印时,发现指定中文字体后水印无法显示,而英文水印可以正常显示
原因分析: moviepy 的 TextClip 在生成水印时,会将 font 参数通过get_setting拼接到命令行,使用subprocess_call以执行命令的方式交给 ImageMagick 处理
在 Windows 系统下,os.path.join 方法生成的字体路径包含反斜杠(\),但是ImageMagick 只识别正斜杠(/)或 Unix 风格的路径,由于路径分隔符不兼容,ImageMagick 找不到指定的字体文件,导致中文水印无法正常显示
解决办法: 把 Windows 下拼接的字体路径中的反斜杠全部替换为正斜杠replace(‘\’, ‘/’)
可执行代码:
from moviepy.editor import *
from moviepy.config import change_settings
from moviepy.video.VideoClip import TextClip
from app import setting
# 配置 ImageMagick 路径
IMAGEMAGICK_BINARY = r"E:\软件\ImageMagick-7.1.1-Q16\magick.exe"
change_settings({"IMAGEMAGICK_BINARY": IMAGEMAGICK_BINARY})
def add_video_watermark(input_path, output_path, text):
try:
# 加载视频
video = VideoFileClip(input_path)
# 创建文字,指定文字大小和颜色
txt_clip = (TextClip(text,
font=os.path.join(setting.FONTS_DIR, 'SimHei.ttf').replace('\\', '/'), # 使用中文字体
fontsize=40, # 设置字体大小
color='black') # 设置字体颜色
.set_position(lambda t: (150 * t, 50 * t)) # 随着时间移动
.set_duration(video.duration)) # 水印持续时间
# 在视频上覆盖文本
result = CompositeVideoClip([video, txt_clip])
# 保存结果
result.write_videofile(output_path, fps=25) # fps:视频文件中每秒的帧数
# 关闭视频文件
video.close()
result.close()
print(f"视频水印已保存到 {output_path}")
except Exception as e:
print(f"视频水印处理失败: {str(e)}")
raise e