不想花钱买会员,自己动手用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}")
相关推荐
神仙别闹10 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
Y幽谷客10 小时前
Python加载本地大模型(Qwen3.5 8B)
python·大模型
伞伞悦读11 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
线上放牧人11 小时前
Windows删除图标缓存
windows·python·pyqt
qq_54702617912 小时前
Python 变量和简单数据类型
python
智搜广告13 小时前
智搜广告:科技行业AI回答优化公司如何破局
大数据·python·elasticsearch·geo
IpdataCloud13 小时前
AI智能体调用工具怎么核验来源IP?归属地、网络类型与代理风险识别(含Python代码)
数据库·python·tcp/ip
2601_9669496514 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
蒸鱼Yuzheng14 小时前
Python 游戏测试开发怎么准备:日志解析、接口校验、并发与可维护性
自动化测试·python·测试开发·面试题·游戏测试
m0_7345717614 小时前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g