一、开发环境搭建与依赖安装
在开始编写自动化脚本之前,必须先配置好Python环境和FFmpeg多媒体处理框架。所有操作均基于Windows 10/11系统演示,Mac或Linux用户可参照对应路径进行调整。
1. 安装Python运行环境
Python是本脚本的核心运行语言。请访问Python官方发布页下载安装包。
下载地址:https://www.python.org/downloads/release/python-31011/
下载完成后,运行安装程序。在安装向导的第一个界面,务必勾选底部的"Add python.exe to PATH"选项,这一步至关重要,否则后续无法在命令行直接调用Python。勾选后,点击"Install Now"完成安装。
安装完成后,打开CMD(命令提示符),输入以下命令验证是否安装成功:
```bash
python --version
```
如果终端返回版本号(例如Python 3.10.11),则说明环境变量配置正确。
2. 安装FFmpeg核心库
FFmpeg是处理音视频数据的底层工具,Python脚本将通过调用FFmpeg命令来实现视频剪辑。我们需要下载FFmpeg的静态构建版本并手动配置环境变量。
下载地址:https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip
下载并解压压缩包。为了方便管理,建议将解压后的文件夹重命名为ffmpeg,并直接移动到C盘根目录下,即路径为C:\ffmpeg。
接下来配置系统环境变量:
- 右键点击"此电脑",选择"属性" -> "高级系统设置" -> "环境变量"。
- 在"系统变量"区域找到名为
Path的变量,选中并点击"编辑"。
- 点击"新建",输入FFmpeg的bin目录路径:C:\ffmpeg\bin。
- 点击"确定"保存所有设置。
配置完成后,重新打开CMD窗口,输入验证命令:
```bash
ffmpeg -version
```

如果终端显示FFmpeg版本信息及配置详情,说明安装成功。
二、批量视频处理脚本编写
本脚本将实现一个典型的新媒体运营场景:将横向视频(16:9)自动裁剪并填充为竖向视频(9:16),并添加统一的Logo水印。这是制作抖音、快手短视频最常用的标准化操作。
1. 准备目录结构
在D盘创建一个工作目录D:\video_auto_edit。在该目录下创建三个文件夹:
- input:存放原始横向视频素材。
- output:存放处理完成的竖向视频。
- logo:存放水印图片(如logo.png),建议准备一张背景透明的PNG图片。
2. 核心代码实现
在D:\video_auto_edit目录下新建一个文本文件,将其重命名为auto_editor.py。使用记事本或VS Code打开该文件,复制并粘贴以下完整代码:
```python
import os
import subprocess
================= 配置区域 =================
定义基础路径
BASE_DIR = r"D:\video_auto_edit"
INPUT_DIR = os.path.join(BASE_DIR, "input")
OUTPUT_DIR = os.path.join(BASE_DIR, "output")
LOGO_PATH = os.path.join(BASE_DIR, "logo", "logo.png") 确保logo.png存在
视频参数配置
TARGET_WIDTH = 1080 目标宽度
TARGET_HEIGHT = 1920 目标高度 (9:16)
THREADS = 4 使用的CPU线程数
def ensure_dir(directory):
"""检查文件夹是否存在,不存在则创建"""
if not os.path.exists(directory):
os.makedirs(directory)
def process_video(input_file, output_file):
"""
使用FFmpeg处理单个视频:
1. 缩放并保持比例,不足部分填充黑边
2. 叠加水印图片
"""
检查水印文件是否存在
overlay_filter = ""
if os.path.exists(LOGO_PATH):
水印位置:右下角,距离边缘10像素
overlay_filter = f"[v1];movie={LOGO_PATH}[wm];[v][wm]overlay=main_w-overlay_w-10:main_h-overlay_h-10"
else:
print(f"警告:未找到水印文件 {LOGO_PATH},将跳过水印添加步骤。")
构建FFmpeg滤镜链
scale=1080:1920:force_original_aspect_ratio=decrease: 保持比例缩放,不超过1080x1920
pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black: 将不足部分填充黑边,居中显示
scale_filter = f"scale={TARGET_WIDTH}:{TARGET_HEIGHT}:force_original_aspect_ratio=decrease,pad={TARGET_WIDTH}:{TARGET_HEIGHT}:(ow-iw)/2:(oh-ih)/2:black"
组合滤镜
if overlay_filter:
full_filter = f"[0:v]{scale_filter}[v];{overlay_filter}"
else:
full_filter = scale_filter
FFmpeg命令构建
-y: 覆盖输出文件
-i: 输入文件
-filter_complex: 复杂滤镜图
-map: 映射流(视频流和音频流)
-c:v libx264: 视频编码器
-preset fast: 编码速度与压缩率的平衡
-crf 23: 视频质量控制(18-28,越小质量越好)
cmd = [
"ffmpeg",
"-y",
"-i", input_file,
"-i", LOGO_PATH if os.path.exists(LOGO_PATH) else "",
"-filter_complex", full_filter,
"-map", "[v1]" if overlay_filter else "0:v",
"-map", "0:a?",
"-c:v", "libx264",
"-preset", "fast",
"-crf", "23",
"-c:a", "aac",
"-b:a", "128k",
output_file
]
如果没有水印,移除多余的-i参数
if not os.path.exists(LOGO_PATH):
cmd.remove("-i")
cmd.remove("")
修正map映射
cmd[cmd.index("-map") + 1] = "0:v"
try:
print(f"正在处理: {os.path.basename(input_file)} ...")
使用subprocess调用命令,捕获输出以避免终端刷屏
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.returncode == 0:
print(f"成功生成: {os.path.basename(output_file)}")
else:
print(f"处理失败: {os.path.basename(input_file)}")
print(result.stderr.decode('utf-8', errors='ignore'))
except Exception as e:
print(f"发生异常: {e}")
def main():
ensure_dir(OUTPUT_DIR)
获取input文件夹下所有视频文件
supported_formats = ('.mp4', '.mov', '.avi', '.mkv')
files = [f for f in os.listdir(INPUT_DIR) if f.lower().endswith(supported_formats)]
if not files:
print(f"在 {INPUT_DIR} 目录下未找到视频文件。")
return
print(f"检测到 {len(files)} 个视频文件,开始批量处理...")
for filename in files:
input_path = os.path.join(INPUT_DIR, filename)
output_path = os.path.join(OUTPUT_DIR, f"new_{filename}")
process_video(input_path, output_path)
print("所有任务处理完毕。")
if __name__ == "__main__":
main()
```
3. 代码关键参数解析
为了确保大家能根据自身需求调整代码,以下对核心参数进行详细说明:
- force_original_aspect_ratio=decrease:这是视频裁剪的关键。它告诉FFmpeg在缩放时强制保持原始视频的宽高比,确保视频不会被拉伸变形,只会缩小以适应目标框。
- pad=...:black:当原始视频比例与目标比例(如16:9转9:16)不一致时,缩放后会出现空白区域。此参数将空白区域填充为黑色背景,并自动计算坐标实现居中。
- overlay=main_w-overlay_w-10:main_h-overlay_h-10:水印定位逻辑。
main_w是视频总宽度,overlay_w是水印宽度。两者相减再减去10像素,即代表将水印定位在距离右下角10像素的位置。
- -preset fast:编码速度预设。可选值有ultrafast, superfast, veryfast, faster, fast, medium, slow等。对于新媒体快速产出,
fast是速度和画质的最佳平衡点。
三、脚本执行与效果验证
代码编写完成后,即可进行实际操作。请确保在input文件夹中放入至少一个测试用的MP4视频文件,并在logo文件夹中放入logo.png。
1. 启动脚本
在D:\video_auto_edit文件夹空白处,按住键盘Shift键并右键点击鼠标,在弹出的菜单中选择"在此处打开PowerShell窗口"或"在此处打开命令窗口"。
输入以下命令并回车:
```bash
python auto_editor.py
```
2. 观察处理过程
终端窗口将实时显示处理日志。你会看到类似以下的输出信息:
```text
检测到 3 个视频文件,开始批量处理...
正在处理: raw_clip_01.mp4 ...
成功生成: new_raw_clip_01.mp4
正在处理: raw_clip_02.mp4 ...
成功生成: new_raw_clip_02.mp4
所有任务处理完毕。
```
3. 结果检查
打开output文件夹,查看生成的视频文件。使用任意播放器打开,验证以下几点:
- 视频分辨率是否变为
1080x1920。
- 原始画面内容是否完整且居中,上下是否有黑边(如果是横转竖)。
- 右下角是否正确显示了Logo水印,且Logo没有遮挡视频主体内容。
- 视频时长是否与原视频一致。
通过以上步骤,你已经搭建了一套完全自动化的新媒体视频处理流水线。后续只需将原始素材拖入input文件夹,运行一行命令,即可批量获得符合短视频平台规格的成品,极大地提升了内容分发效率。