要将一组图片转换为 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}")