使用 openCV 从 numpy 数组生成视频
Generate video from numpy arrays with openCV
我正在尝试使用 openCV VideoWriter class 从 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
导致此问题的原因可能是什么?
第一个问题是您尝试使用黑白帧创建视频,而 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()
我正在尝试使用 openCV VideoWriter class 从 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
导致此问题的原因可能是什么?
第一个问题是您尝试使用黑白帧创建视频,而 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()