使用openCV从numpy数组生成视频

11

我正在尝试使用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: Could not find codec parameters for stream 0 (Video: h264 (X264 / 0x34363258), none, 1280x720): unspecified pixel format

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

1个回答

17

首先问题在于您尝试创建一个使用黑白帧的视频,而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低得多。 - daVinci
1
太好了!也许X264对我不起作用是因为我没有安装libx264?无论如何,很高兴听到它对你有用 :) - Tyson
更新:我后来发现视频并没有使用上述代码中的H264编码方法进行编码。我找到了一种解决方案,使用思科的OpenH264二进制文件之一。它必须被下载并放置在同一个工作目录中。只要二进制版本是1.8且名称未更改(截至本评论日期,更新版本不起作用),OpenCV似乎会自动找到它。https://github.com/cisco/openh264/releases - Tyson
忘了提一下,当使用思科的OpenH264二进制文件时,将fourcc代码更改为"avc1"。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接