视频裁剪+缩放+自动添加水印脚本(Python版)

场景代入

一键搞定裁剪、缩放与动态水印 做视频剪辑的朋友,是不是经常遇到这种情况:素材的顶部有黑边或无关信息需要裁掉,分辨率不统一需要调整,最后还得一个个加上水印。如果视频数量一多,这些重复性操作简直让人头大。

别担心,今天分享的这款 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 库来处理视频。请在终端或命令行中运行以下命令进行安装:

bash 复制代码
pip 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("所有任务执行完毕,按回车键退出...")
相关推荐
AC赳赳老秦1 小时前
Excel 动态仪表盘制作:用 OpenClaw 自动处理数据、生成交互式图表并实时更新仪表盘
大数据·服务器·后端·测试用例·excel·deepseek·openclaw
霍格沃兹测试开发学社测试人社区1 小时前
Node.js 浏览器引擎 + Python 大脑:Playwright 混合架构爬虫系统深度解析
python·架构·node.js
酷酷的身影1 小时前
Managers/APConfigManager.cs
开发语言·ui·c#
拳里剑气1 小时前
C++算法:优先级队列
开发语言·c++·算法·优先级队列
小七在进步1 小时前
数据结构:用队列实现栈
开发语言·数据结构
绘梨衣5472 小时前
求助帖:pdf复杂表格解析
爬虫·python·pdf
从零开始的代码生活_2 小时前
C++ 模板入门:函数模板、类模板与实例化机制
开发语言·c++·后端
梦帮科技2 小时前
Rust+Tauri+EVM:构建下一代内存安全级数字版权(DRM)主权音频网络与跨链金融系统的技术实践与全景架构
网络·安全·架构·rust·区块链·音视频·web3.py
luj_176810 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法