场景代入
一键搞定裁剪、缩放与动态水印 做视频剪辑的朋友,是不是经常遇到这种情况:素材的顶部有黑边或无关信息需要裁掉,分辨率不统一需要调整,最后还得一个个加上水印。如果视频数量一多,这些重复性操作简直让人头大。
别担心,今天分享的这款 Python 脚本,就是为了解决这些痛点而生。它能自动批量处理视频,一次性完成顶部裁剪、分辨率统一,并加上一个会"动"的水印------在视频前半段出现在左上角,后半段自动跳到右下角,既美观又防遮挡。
脚本用途
这个脚本是一个高效的视频批量处理工具,专为简化重复性工作流而设计。
1.核心功能
自动遍历指定文件夹下的所有 .mp4 视频文件,并对它们进行一系列标准化处理。
2.三大处理步骤
①智能裁剪:自动裁掉视频顶部的指定像素,轻松去除黑边、台标或无关信息。
②统一分辨率:将所有视频缩放到预设的分辨率(默认为 1920x1080),确保输出规格一致。
③动态水印:为视频添加一个图片水印,并且这个水印的位置是动态变化的。它会在视频播放到一半时,自动从左上角移动到右下角,有效避免长时间遮挡画面关键内容。
脚本逻辑说明
1.配置区域
脚本开头定义了一系列常量,方便用户自定义。你只需要修改这些变量的值,就能改变脚本的行为,而无需动核心代码。
2.核心处理函数 (process_video) 这是处理单个视频的"流水线",逻辑环环相扣:
①加载视频:使用 VideoFileClip 读取输入的视频文件。
②裁剪 (crop):根据 CROP_TOP 的值,调用 .crop(y1=CROP_TOP) 方法裁掉视频顶部。
③缩放 (resize):调用 .resize((TARGET_W, TARGET_H)) 方法,将视频调整为目标分辨率。
④处理水印:
使用 ImageClip 加载水印图片。
根据 WATERMARK_SCALE 计算新的尺寸并缩放水印。
使用 .set_duration(video.duration) 让水印的持续时间与视频保持一致。
⑤动态定位 (set_position):这是脚本的亮点。定义了一个 change_position(t) 函数,它接收时间 t 作为参数。
当 t 小于视频总时长的一半时,函数返回左上角的坐标 (MARGIN, MARGIN)。
当 t 大于等于一半时,函数返回右下角的坐标 (视频宽-水印宽-MARGIN, 视频高-水印高-MARGIN)。
通过 watermark.set_position(change_position) 将这个函数应用给水印,就实现了位置的动态变化。
⑥合成与导出 (CompositeVideoClip):将处理好的视频图层和水印图层叠加,最后使用 write_videofile 导出为新的视频文件。
3.批量处理函数 (batch_process)
该函数会自动获取脚本所在的目录,并查找所有 .mp4 文件。
它会检查水印图片路径是否正确,并自动创建一个名为 output 的文件夹用于存放结果。
最后,通过一个循环,依次调用 process_video 函数处理每一个找到的视频文件。
前置环境准备
在运行脚本之前,请确保你的电脑已准备好以下环境:
①安装 Python:确保已安装 Python 环境(推荐 Python 3.6 或更高版本)。
②安装依赖库:该脚本依赖强大的 moviepy 库来处理视频。请在终端或命令行中运行以下命令进行安装:
bashpip install moviepy③准备水印图片:准备一张你想要添加的水印图片(支持 PNG 等格式),并记住它的存放路径。建议使用带有透明通道的 PNG 图片,效果更佳。
使用步骤
1.保存脚本
将下方的 Python 代码保存为一个 .py 文件,例如 video_processor.py
2.修改配置
用文本编辑器打开 video_processor.py,找到顶部的配置区域,根据你的需求进行修改:
①CROP_TOP:设置要裁掉视频顶部的像素值。如果不需要裁剪,设为 0
②TARGET_W, TARGET_H:设置最终输出的视频宽度和高度
③WATERMARK_IMAGE_PATH:将引号内的路径修改为你自己水印图片的绝对路径。例如:r"C:\Users\YourName\Pictures\watermark.png"。注意路径前的 r 字符不要去掉,它可以避免转义问题
④MARGIN:设置水印距离视频边缘的距离(像素)
⑤WATERMARK_SCALE:设置水印的缩放比例。1.0 为原始大小,0.3 表示缩小到原始的 30%
3.放置文件
将 video_processor.py 脚本和你想要处理的所有 .mp4 视频文件放在同一个文件夹下
4.运行脚本
在该文件夹路径下打开终端或命令行,输入 python video_processor.py 并回车。脚本会自动开始处理,完成后会在同目录下生成一个名为 output 的文件夹,处理好的视频就在里面
效果展示
视频裁剪+缩放+自动添加水印脚本效果演示
源码展示
python
import os
from moviepy.editor import VideoFileClip, CompositeVideoClip, ImageClip
# ================= 配置区域 =================
CROP_TOP = 45 # 裁掉顶部多少像素
TARGET_W, TARGET_H = 1920, 1080 # 最终视频尺寸
# 【重点修改】这里去掉了多余的引号,并修正了路径格式
WATERMARK_IMAGE_PATH = r"C:\Users\王洋\Desktop\test2\水印.png"
MARGIN = 30 # 距离边缘的距离 (像素)
WATERMARK_SCALE = 0.30 # 【新增】水印缩放比例。1.0是原大,0.1是10%大小。建议从0.15开始尝试
# ==============================================
def process_video(input_path, output_path):
print(f"正在处理: {os.path.basename(input_path)}")
try:
video = VideoFileClip(input_path)
# 1. 裁剪顶部
if CROP_TOP > 0:
video = video.crop(y1=CROP_TOP)
# 2. 调整分辨率
video = video.resize((TARGET_W, TARGET_H))
# 3. 加载并缩放水印图片
watermark = ImageClip(WATERMARK_IMAGE_PATH)
# 计算缩放后的尺寸
new_w = int(watermark.w * WATERMARK_SCALE)
new_h = int(watermark.h * WATERMARK_SCALE)
watermark = watermark.resize((new_w, new_h))
# 设置水印时长与视频一致
watermark = watermark.set_duration(video.duration)
# 4. 核心逻辑:根据时间动态改变位置
def change_position(t):
# 获取当前视频画面的宽高
w, h = video.size
wm_w, wm_h = watermark.size
# 视频前半段在左上角
if t < video.duration / 2:
return (MARGIN, MARGIN)
# 视频后半段在右下角
else:
return (w - wm_w - MARGIN, h - wm_h - MARGIN)
# 应用位置函数
watermark = watermark.set_position(change_position)
# 5. 合成视频
final_video = CompositeVideoClip([video, watermark])
# 6. 导出视频
final_video.write_videofile(
output_path,
codec='libx264',
audio_codec='aac',
temp_audiofile='temp-audio.m4a',
remove_temp=True
)
print(f"✅ 处理完成: {output_path}")
except Exception as e:
print(f"❌ 处理失败 {input_path}: {str(e)}")
def batch_process():
# 获取当前脚本所在的文件夹
current_dir = os.path.dirname(os.path.abspath(__file__))
# 检查水印文件是否存在
if not os.path.exists(WATERMARK_IMAGE_PATH):
print(f"❌ 错误:找不到水印图片,请检查路径:{WATERMARK_IMAGE_PATH}")
return
output_dir = os.path.join(current_dir, "output")
if not os.path.exists(output_dir):
os.makedirs(output_dir)
print(f"已创建输出文件夹: {output_dir}")
mp4_files = [f for f in os.listdir(current_dir) if f.lower().endswith(".mp4")]
if not mp4_files:
print("当前文件夹下没有找到 MP4 视频文件。")
return
print(f"发现 {len(mp4_files)} 个视频文件,开始处理...")
for filename in mp4_files:
input_path = os.path.join(current_dir, filename)
output_path = os.path.join(output_dir, f"processed_{filename}")
process_video(input_path, output_path)
if __name__ == "__main__":
batch_process()
input("所有任务执行完毕,按回车键退出...")