使用 openCV 从 numpy 数组生成视频

Posted

技术标签:

【中文标题】使用 openCV 从 numpy 数组生成视频【英文标题】:Generate video from numpy arrays with openCV 【发布时间】:2020-11-02 22:44:14 【问题描述】:

我正在尝试使用 openCV VideoWriter 类从 numpy 数组生成视频。我正在使用以下代码:

import numpy as np
import cv2
size = 720*16//9, 720
duration = 2
fps = 25
out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc(*'X264'), fps, size)
for _ in range(fps * duration):
    data = np.random.randint(0, 256, size, dtype='uint8')
    out.write(data)
out.release()

编解码器似乎已安装,因为 ffmpeg 可以转换为 x264 编解码器并安装了 libx264。代码在没有警告的情况下运行,但是生成的视频似乎不包含任何数据,因为我在尝试使用 mpv 阅读它们时总是收到以下消息:

[ffmpeg/demuxer] avi:找不到流 0 的编解码器参数(视频:h264 (X264 / 0x34363258),无,1280x720):未指定的像素格式

这个问题的原因可能是什么?

【问题讨论】:

【参考方案1】:

第一个问题是您尝试使用黑白帧创建视频,而 VideoWriter 默认采用彩色。 VideoWriter 有第 5 个布尔参数,您可以在其中传递 False 来指定视频是黑白的。

第二个问题是 cv2 期望的维度与 numpy 是相反的。因此,大小应该是 (size[1], size[0])。

另一个可能的问题是正在使用的编解码器。我一直无法让“X264”在我的机器上工作,而是一直使用“mp4v”作为编解码器,使用“.mp4”作为容器类型以获得 H.264 编码输出。

在所有这些问题都解决之后,这就是结果。请试试这个,看看它是否适合你:

import numpy as np
import cv2
size = 720*16//9, 720
duration = 2
fps = 25
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (size[1], size[0]), False)
for _ in range(fps * duration):
    data = np.random.randint(0, 256, size, dtype='uint8')
    out.write(data)
out.release()

【讨论】:

这行得通,我只是想补充一点,X264 编解码器也可以工作,但生成的视频质量比 mp4v 低得多 太棒了!也许 X264 对我不起作用,因为我没有安装 libx264?无论如何,我很高兴听到它对你有用:) 更新:我发现视频没有使用上述代码中的方法进行 H264 编码。我找到了一个使用 Cisco 的 OpenH264 二进制文件的解决方案。它必须下载并放置在同一工作目录中。只要二进制版本为 1.8 并且名称未更改,OpenCV 似乎会自动找到它(截至本评论发布之日,较新的版本不起作用)。 github.com/cisco/openh264/releases

以上是关于使用 openCV 从 numpy 数组生成视频的主要内容,如果未能解决你的问题,请参考以下文章

使用 cv2 VideoWriter 编写 numpy 数组

使用 Python 将 OpenCV BoundingRect 转换为 NumPy 数组

OpenCV-Python2.NumPy的简单操作

用Python从屏幕捕获视频数据

Python - 使用 OpenCV 将字节图像转换为 NumPy 数组

OpenCV 使用 stride 从数组生成 cv::Mat