import numpy as np
import cv2
cap = cv2.VideoCapture(0)
//定义视频编码器
//这里有必要提一下fourcc
//FourCC全称Four-Character Codes,代表四字符代码 (four character code), 它是一个32位的标示符,其实就是typedef unsigned int FOURCC;是一种独立标示视频数据流格式的四字符代码。
//因此cv2.VideoWriter_fourcc()函数的作用是输入四个字符代码即可得到对应的视频编码器。
fourcc = cv2.VideoWriter_fourcc(*'XVID')//使用XVID编码器
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))//出分别是:保存文件名、编码器、帧率、视频宽高
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
# 保存录像结果
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# 释放内存
cap.release()
out.release()
cv2.destroyAllWindows()
问题
不幸的是,大多数情况下上述代码并不能正常工作。尽管非常仔细的检查代码,我们也并不能找出任何问题。那么程序不能正常工作的原因究竟是什么的?
为了解释这个问题,首先需要对视频文件格式、视频封装格式和视频编码器等等有一个基础的了解。
参考知乎答案的答案,可以发现:
视频文件格式,即视频文件的后缀,如mp4,avi等等,主要为帮助系统的程序知道应该使用何种程序打开该文件;这就是说如果你把一个视频格式的文件后缀从avi改成mp4,并不意味该文件就变成了mp4格式。
视频封装格式则是一种视频封装容器。什么意思呢?在视频文件中同时含有视频部分、音频部分等等;那么视频封装容器则一种可以把多种视频数据放在一起的一个大盒子。这个盒子就是我们常说的视频格式,例如AVI(后缀.avi)格式、MPEG(后缀.mpg .mpeg .mpe .dat .vob .asf .3gp .mp4)格式、REAL Video(后缀.rmvb)格式、Flash Video(后缀.flv)格式等等。
那么视频编码器又是什么呢?视频编码器是指能够对数字视频进行压缩存储和解压缩的程序或设备。目前场景的编码器有H.26X系列(目前最流行的是H.264和H.265)和MPEG系列(目前最流行的是MPEG-4第十部分,即H.264)。上文代码中提到的XVID(旧称为DIVX)是一个开放源代码的MPEG-4视频编解码器.
经过上述介绍想必你已经对视频有了一个基本的了解和认识,那么接下来我就说出上述程序失败的原因:
系统中不存在对应的编码器!
解决方案
后来发现很简单,严格按照Opencv官方的编译指南,把所有的依赖库都安装上,而且安装一个解码器。
转载:https://blog.csdn.net/u012348774/article/details/78255130