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

📅 2026/7/12 10:49:26
视频裁剪+缩放+自动添加水印脚本(Python版)
场景代入一键搞定裁剪、缩放与动态水印 做视频剪辑的朋友是不是经常遇到这种情况素材的顶部有黑边或无关信息需要裁掉分辨率不统一需要调整最后还得一个个加上水印。如果视频数量一多这些重复性操作简直让人头大。别担心今天分享的这款 Python 脚本就是为了解决这些痛点而生。它能自动批量处理视频一次性完成顶部裁剪、分辨率统一并加上一个会“动”的水印——在视频前半段出现在左上角后半段自动跳到右下角既美观又防遮挡。脚本用途这个脚本是一个高效的视频批量处理工具专为简化重复性工作流而设计。1.核心功能自动遍历指定文件夹下的所有 .mp4 视频文件并对它们进行一系列标准化处理。2.三大处理步骤①智能裁剪自动裁掉视频顶部的指定像素轻松去除黑边、台标或无关信息。②统一分辨率将所有视频缩放到预设的分辨率默认为 1920x1080确保输出规格一致。③动态水印为视频添加一个图片水印并且这个水印的位置是动态变化的。它会在视频播放到一半时自动从左上角移动到右下角有效避免长时间遮挡画面关键内容。脚本逻辑说明1.配置区域脚本开头定义了一系列常量方便用户自定义。你只需要修改这些变量的值就能改变脚本的行为而无需动核心代码。2.核心处理函数 (process_video) 这是处理单个视频的“流水线”逻辑环环相扣①加载视频使用 VideoFileClip 读取输入的视频文件。②裁剪 (crop)根据 CROP_TOP 的值调用 .crop(y1CROP_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 库来处理视频。请在终端或命令行中运行以下命令进行安装pip install moviepy③准备水印图片准备一张你想要添加的水印图片支持 PNG 等格式并记住它的存放路径。建议使用带有透明通道的 PNG 图片效果更佳。使用步骤1.保存脚本将下方的 Python 代码保存为一个 .py 文件例如 video_processor.py2.修改配置用文本编辑器打开 video_processor.py找到顶部的配置区域根据你的需求进行修改①CROP_TOP设置要裁掉视频顶部的像素值。如果不需要裁剪设为 0②TARGET_W, TARGET_H设置最终输出的视频宽度和高度③WATERMARK_IMAGE_PATH将引号内的路径修改为你自己水印图片的绝对路径。例如rC:\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 的文件夹处理好的视频就在里面效果展示视频裁剪缩放自动添加水印脚本效果演示源码展示import os from moviepy.editor import VideoFileClip, CompositeVideoClip, ImageClip # 配置区域 CROP_TOP 45 # 裁掉顶部多少像素 TARGET_W, TARGET_H 1920, 1080 # 最终视频尺寸 # 【重点修改】这里去掉了多余的引号并修正了路径格式 WATERMARK_IMAGE_PATH rC:\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(y1CROP_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, codeclibx264, audio_codecaac, temp_audiofiletemp-audio.m4a, remove_tempTrue ) 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, fprocessed_{filename}) process_video(input_path, output_path) if __name__ __main__: batch_process() input(所有任务执行完毕按回车键退出...)