You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用OpenCV/Python合成MP4视频时遇FFMPEG编码错误且生成无效文件的求助

使用OpenCV/Python合成MP4视频时遇FFMPEG编码错误且生成无效文件的求助

嘿,我来帮你看看为啥视频生成失败啦——那个只有5.7kB的文件明显就是有问题的信号,咱们一步步拆解问题、修复代码:

  • 问题1:单通道灰度图与VideoWriter的彩色格式不兼容
    你用cv2.imread(os.path.join(path,file),0)读取的是灰度单通道图像,但创建VideoWriter时没有指定isColor=False,它默认是期望三通道的彩色BGR图像。这种格式不匹配会导致帧无法正确编码,最终生成的视频文件自然无效。

  • 问题2:编码格式可能存在平台兼容性问题
    虽然mp4v是MP4支持的编码,但不同平台(Windows/macOS/Linux)的FFMPEG配置可能不一样,换成更通用的H.264编码(对应的fourcc码是'avc1')通常能解决这类标签不支持的错误。

  • 小bug:路径重复问题
    你已经执行了os.chdir(path)切换工作目录,而且files变量里已经是完整路径了,之后再用os.path.join(path,file)会生成重复路径(比如变成path/path/file.jpg),虽然cv2.imread可能能处理,但最好修正这个问题避免潜在的报错。

这是修复后的代码:

import os
import numpy as np
from glob import glob
import cv2

path = "存放图片的路径"
fname_video = "生成视频的保存路径"

size = (1024, 768)
fps = 20

# 获取前10张JPG图片的完整路径,避免路径重复
files = glob(os.path.join(path, '*.JPG'))[:10]

image_array = []
for file in files:
    # 默认读取彩色图像,如果需要灰度视频可以后续转换
    frame = cv2.imread(file)
    if frame is None:
        print(f"警告:无法读取图片 {file}")
        continue
    frame = cv2.resize(frame, size)
    # 如果确实需要灰度视频,取消下面两行注释,把单通道转成三通道灰度(适配彩色格式)
    # frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
    image_array.append(frame)

# 使用兼容性更好的H.264编码
fourcc = cv2.VideoWriter_fourcc(*'avc1')
# 如果要生成灰度视频,需要在下面添加isColor=False参数
# out = cv2.VideoWriter(fname_video, fourcc, fps, size, isColor=False)
out = cv2.VideoWriter(fname_video, fourcc, fps, size)

for frame in image_array:
    out.write(frame)

out.release()
print("视频生成成功啦!")

额外补充几点:

  • 确保你的OpenCV安装包带有FFMPEG支持(用pip安装的OpenCV一般默认包含);
  • 如果'avc1'编码不行,可以再试试'mp4v',或者测试'H264'(部分OpenCV版本用这个fourcc码);
  • 如果要生成真正的灰度视频,记得取消代码里的转换注释,并在初始化VideoWriter时加上isColor=False

备注:内容来源于stack exchange,提问作者Christof Bodner

火山引擎 最新活动