问题:1、VideoWriter不能写MP4或是其他格式视频;
2、VideoWriter写入保存的视频大小为0kb;
3、VideoCapture读取打开不了MP4格式的视频。
解决:将OpenCV中的opencv_ffmpeg330_64.dll(在OpenCV\build\bin文件夹下,注意这是我的opencv版本)文件拷贝到Python的Lib\site-packages文件夹下(与cv2.pyd文件放在一起解码用)。
编码格式(('M', 'P', '4', '2') 视频大小最小):
cv2.VideoWriter_fourcc('M','J','P','G') = motion-jpeg codec
cv2.VideoWriter_fourcc('P','I','M','1') = MPEG-1 codec
cv2.VideoWriter_fourcc('M', 'P', '4', '2') = MPEG-4.2 codec
cv2.VideoWriter_fourcc('D', 'I', 'V', '3') = MPEG-4.3 codec
cv2.VideoWriter_fourcc('D', 'I', 'V', 'X') = MPEG-4 codec
cv2.VideoWriter_fourcc('U', '2', '6', '3') = H263 codec
cv2.VideoWriter_fourcc('I', '2', '6', '3') = H263I codec
cv2.VideoWriter_fourcc('F', 'L', 'V', '1') = FLV1 codec
通过摄像头录制了长约5分钟的视频,在D盘下生成的文件如下:
生成文件占用空间最小的编码方式是 MPEG-4.2 codec,约为19MB。用红线段标识,对应在VideoWriter类的构造函数参数为CV_FOURCC('M', 'P', '4', '2') 。
最大的是MPEG-1 codec,用蓝线段标识,约为111MB。对应在VideoWriter类的构造函数参数为CV_FOURCC('P','I','M','1') ,所占磁盘空间是前者的5.7倍。所以如果需要24小时全天候录制监控,基于磁盘空间的考虑,可以优先使用MPEG-4.2的编解码方式。
def composeVideo():
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', '2')
# cv2.VideoWriter(path,fourcc,fps,size) path是生成视频路径,fourcc是视频格式,fps表示一秒放多少张图片,size表示大小,一般是视频图像大小
videoWriter = cv2.VideoWriter('out-video\\snake2.avi', fourcc, 10, (1920,1080))
# 我的图片编号是3,6,9,12,...,627,写自己的图片编号就行
for i in range(3,630,3):
image_number = i
print(i)
img12 = cv2.imread('out-video\\out-pic\\' + str(image_number) + '.jpg')
videoWriter.write(img12)
videoWriter.release()