不想花钱买会员,自己动手用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}")
相关推荐
江公望6 小时前
为什么Rust的编译工具依赖C语言的编译工具?
开发语言·rust
编程大师哥6 小时前
Java Web 核心全解析
java·开发语言·前端
qq_214782616 小时前
Hadley Wickham长文回顾:R语言tidyverse过去20年的演进之路、现状与未来展望!
python·算法·线性回归
资深web全栈开发6 小时前
Golang 最常用的库介绍
开发语言·后端·golang
霍田煜熙6 小时前
C++ 部署小型图书管理系统
开发语言·c++·算法
惊鸿.Jh6 小时前
若依自定义后端接口404踩坑记录
java·开发语言
缺点内向6 小时前
C# 中如何从 URL 下载 Word 文档:基于 Spire.Doc 的高效解决方案
开发语言·c#·word
源码获取_wx:Fegn08956 小时前
基于springboot + vue考勤管理系统
java·开发语言·vue.js·spring boot·后端·spring·课程设计