不想花钱买会员,自己动手用python制作视频

要将一组图片转换为 AVI 视频文件,Python 中常用的库有 OpenCV(cv2)和 imageio。以下是两种主流实现方法,涵盖基础用法和进阶优化(如自定义帧率、分辨率、编码格式等)。

方法一:使用 OpenCV(推荐,灵活可控)

OpenCV 是计算机视觉领域的核心库,支持多种视频编码格式,可精细控制视频参数。

步骤 1:安装依赖

bash

运行

pip install opencv-python numpy # numpy用于数组处理,OpenCV依赖

复制代码
import cv2
import os
from pathlib import Path

def images_to_avi_opencv(
    img_dir,          # 图片文件夹路径
    output_avi,       # 输出AVI文件路径
    fps=10,           # 帧率(每秒帧数)
    img_ext=".jpg/.png",   # 图片格式(.jpg/.png等)
    codec="XVID",     # 编码格式(XVID兼容性最好)
    sort_by="name"    # 排序规则:name(按文件名)/number(按数字)
):
    # 1. 获取图片列表
    img_paths = [f for f in Path(img_dir).glob(f"*{img_ext}")]
    if not img_paths:
        raise ValueError("未找到指定格式的图片")

    # 2. 安全排序(核心修复)
    def safe_sort_key(path):
        if sort_by == "number":
            # 提取文件名中的数字,无数字则返回0(避免int('')报错)
            num_str = ''.join(filter(str.isdigit, path.name))
            return int(num_str) if num_str else 0
        else:
            # 按文件名纯字符排序(兼容任意命名)
            return path.name.lower()

    img_paths = sorted(img_paths, key=safe_sort_key)

    # 3. 读取第一张图片,获取视频分辨率
    first_img = cv2.imread(str(img_paths[0]))
    if first_img is None:
        raise ValueError("无法读取第一张图片,请检查路径/格式")
    height, width = first_img.shape[:2]

    # 4. 创建VideoWriter对象
    fourcc = cv2.VideoWriter_fourcc(*codec)  # 编码格式
    video_writer = cv2.VideoWriter(
        output_avi,
        fourcc,
        fps,
        (width, height)  # 视频分辨率(必须与图片一致)
    )

    if not video_writer.isOpened():
        raise RuntimeError("无法创建视频写入对象,请检查编码格式/路径")

    # 5. 逐帧写入视频
    for idx, img_path in enumerate(img_paths):
        img = cv2.imread(str(img_path))
        if img is None:
            print(f"警告:跳过损坏的图片 {img_path}")
            continue
        # 确保图片分辨率与视频一致(可选:自动缩放)
        if img.shape[1] != width or img.shape[0] != height:
            img = cv2.resize(img, (width, height))
        video_writer.write(img)
        if (idx + 1) % 10 == 0:
            print(f"已处理 {idx + 1}/{len(img_paths)} 帧")

    # 6. 释放资源
    video_writer.release()
    cv2.destroyAllWindows()
    print(f"视频已保存至:{output}")

# ------------------- 调用示例 -------------------
if __name__ == "__main__":
    # 替换为你的图片文件夹和输出路径
    IMG_DIR = "./images"    # 存放图片的文件夹
    OUTPUT_AVI = "output.avi"
    
    try:
        images_to_avi_opencv(
            img_dir=IMG_DIR,
            output_avi=OUTPUT_AVI,
            fps=10,          # 自定义帧率(比如10帧/秒)
            img_ext=".png",  # 如果是png图片则修改
            codec="XVID",    # 推荐XVID(兼容Windows/Mac/Linux)
            sort_by="name"   # 若图片是img1.jpg、img2.jpg则用"number"
        )
    except Exception as e:
        print(f"错误:{e}")
相关推荐
Amelia1111114 分钟前
day49
python
天天进步201510 分钟前
【Nanobrowser源码分析4】交互篇: 从指令到动作:模拟点击、滚动与输入的底层实现
开发语言·javascript·ecmascript
REDcker15 分钟前
Android WebView 版本升级方案详解
android·音视频·实时音视频·webview·js·编解码
console.log('npc')17 分钟前
vue2中子组件父组件的修改参数
开发语言·前端·javascript
码点18 分钟前
【无标题】日文字库Japan.ini
开发语言
IT=>小脑虎21 分钟前
2026版 Python零基础小白学习知识点【基础版详解】
开发语言·python·学习
我想吃烤肉肉25 分钟前
Playwright中page.locator和Selenium中find_element区别
爬虫·python·测试工具·自动化
rabbit_pro29 分钟前
Java使用Mybatis-Plus封装动态数据源工具类
java·python·mybatis
wjs202432 分钟前
抽象工厂模式
开发语言
lly20240633 分钟前
SVG 模糊效果详解
开发语言