不想花钱买会员,自己动手用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}")
相关推荐
花开·莫之弃8 小时前
Mac安装多版本jdk(jenv)
java·开发语言·macos
qq_401700418 小时前
Qt 自定义无边框窗口:标题栏、拖拽移动与缩放
开发语言·qt
fish_xk8 小时前
c++11的初见
开发语言·c++·算法
Amctwd9 小时前
【JavaScript】JS 异步 Promise 解析
开发语言·前端·javascript
老纪9 小时前
c++怎么利用std--variant处理多种二进制子协议包的自动分支解析【进阶】
jvm·数据库·python
JAVA面经实录9179 小时前
JVM高频面试总结(背诵完整版)
java·开发语言·jvm
茗创科技9 小时前
Nat Hum Behav | 特征选择会导致基于脑影像的机器学习生物标志物产生迥异的神经生物学解释
python·深度学习·机器学习·matlab·脑网络
IT策士9 小时前
Django 从 0 到 1 打造完整电商平台:Django 模型进阶与数据迁移
python·django·sqlite
沪漂阿龙9 小时前
Java JVM 面试题详解:JVM运行原理、内存模型、堆栈方法区、GC垃圾回收、JIT编译、类加载机制与线上调优全攻略
java·开发语言·jvm
OsDepK9 小时前
AudioSplit音频多轨免费分离工具即将发布
ide·git·python·音视频·集成学习