用 Python 自制视频压缩工具,告别搜索烦恼

用 Python 自制视频压缩工具,告别搜索烦恼

每次压缩视频文件时,都要在网上苦苦寻找“免费软件”,但结果往往不尽如人意:要么功能受限、隐藏收费,要么对电脑配置要求过高,使用起来非常不便。

最近我尝试结合 AI 工具,编写了一个轻量级的视频压缩脚本,完美满足我的日常需求。特此记录分享,方便自己也帮助他人。

为什么写这个脚本?

  • 小巧实用:不需要安装大型软件,依赖标准库 + OpenCV 就可运行。
  • 自动适配比例:支持按指定分辨率(如 960x1280)进行中心裁剪+缩放,保留主体画面。
  • 批量处理多个视频:自动读取指定目录下的所有视频文件并逐一处理。
  • 跨平台兼容性好:支持 Windows、Mac 和 Linux 系统。

实现思路

整个脚本分为三个主要部分:

  1. 获取输入目录中的视频文件列表
  2. 逐帧读取并处理每一帧图像
  3. 将处理后的帧重新封装为视频输出

技术亮点:

  • 使用 <code>cv2</code> 进行视频读写操作;
  • 使用 <code>os</code> 模块进行路径管理和文件筛选;
  • 使用 <code>tqdm</code> 显示进度条,提升用户体验;
  • 支持多种主流格式(如 <code>.mp4</code>, <code>.avi</code>, <code>.mov</code>, <code>.mkv</code>)。

✅ 完整代码如下:

import os
import cv2
from tqdm import tqdm

def get_video_files(input_dir):
    &quot;&quot;&quot;获取指定目录中所有支持格式的视频文件&quot;&quot;&quot;
    video_extensions = [&#039;.mp4&#039;, &#039;.avi&#039;, &#039;.mov&#039;, &#039;.mkv&#039;]
    return [
        f for f in os.listdir(input_dir)
        if os.path.splitext(f)[1].lower() in video_extensions
    ]

def process_video(input_path, output_path):
    &quot;&quot;&quot;处理单个视频文件:中心裁剪并缩放到目标尺寸&quot;&quot;&quot;
    cap = cv2.VideoCapture(input_path)
    if not cap.isOpened():
        print(f&quot;无法打开视频文件: {input_path}&quot;)
        return False

    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

    # 目标尺寸:960x1280(3:4 比例,适合竖屏)
    target_width, target_height = 960, 1280

    fourcc = cv2.VideoWriter_fourcc(*&#039;mp4v&#039;)
    out = cv2.VideoWriter(output_path, fourcc, fps, (target_width, target_height))

    for _ in tqdm(range(frame_count), desc=f&quot;处理 {os.path.basename(input_path)}&quot;):
        ret, frame = cap.read()
        if not ret:
            break

        orig_ratio = width / height
        target_ratio = target_width / target_height

        # 根据原始比例计算裁剪区域
        if orig_ratio &gt; target_ratio:
            crop_width = int(height * target_ratio)
            crop_height = height
            x = (width - crop_width) // 2
            y = 0
        else:
            crop_width = width
            crop_height = int(width / target_ratio)
            x = 0
            y = (height - crop_height) // 2

        # 裁剪并缩放
        cropped = frame[y:y+crop_height, x:x+crop_width]
        resized = cv2.resize(cropped, (target_width, target_height))

        out.write(resized)

    cap.release()
    out.release()
    return True

def main():
    input_dir = &quot;video&quot;
    output_dir = &quot;video_output&quot;

    os.makedirs(output_dir, exist_ok=True)

    video_files = get_video_files(input_dir)
    if not video_files:
        print(f&quot;在目录 {input_dir} 中未找到支持的视频文件&quot;)
        return

    print(f&quot;共找到 {len(video_files)} 个视频文件&quot;)

    for video_file in video_files:
        input_path = os.path.join(input_dir, video_file)
        filename, ext = os.path.splitext(video_file)
        output_path = os.path.join(output_dir, f&quot;{filename}_resized{ext}&quot;)

        print(f&quot;\n开始处理: {video_file}&quot;)
        success = process_video(input_path, output_path)
        if success:
            print(f&quot;处理完成,已保存至: {output_path}&quot;)
        else:
            print(f&quot;处理失败: {video_file}&quot;)

if __name__ == &quot;__main__&quot;:
    main()

📦 使用说明

1. 准备工作:

  • 安装依赖库(如尚未安装):
    pip install opencv-python tqdm

2. 文件结构:

project/
├── video/             ← 存放待压缩的视频文件
│   ├── example1.mp4
│   └── example2.mov
├── script.py          ← 上面的脚本
└── video_output/      ← 处理完成后自动生成的输出目录

3. 自定义修改:

  • 如果需要其他分辨率(如 720x1280 或 1080x1920),只需修改 <code>target_width</code> 和 <code>target_height</code> 即可。
  • 支持扩展更多视频格式,在 <code>get_video_files()</code> 中添加即可。

这个脚本虽然简单,但非常适合小规模视频压缩的需求。对于不想安装复杂软件或受限于网速的朋友来说,是一个非常不错的替代方案。

比起动辄几十 MB 的压缩软件,Python 脚本更灵活、透明、可控。

如你有进一步需求,比如增加 GUI 界面、可视化参数设置、多线程加速等,也可以基于此类脚本进行拓展。

感兴趣的朋友欢迎留言交流,或者一起优化改进这个小工具!