#py+opencv摄像头录制视频时间延迟问题**
问题:
py+opencv录制视频时间总是出现延迟和帧率与视频长度对齐不一致的问题,导致生成的录频片段,时间长度,有长有短,不能固定成统一的长度。
原因:
1.cv2摄像头的曝光速度过长,需要按摄像头的合适(最小)曝光时间调整
2.cv2摄像头的缓冲帧过多,需要更改缓冲帧数量
3.ret2, frame2 = cap2.read()在第一次读取数据时,会有延迟问题出现
4. cv2.waitKey的延时时间值需要对每一次while循环读帧进行动态修改
5.while一次整个代码循环体的执行速度,同样会拖累延迟执行的时间标准性
6.以time分钟作为触发保存条件,由于time.time()读取的是毫秒级数值,会出现读取的数值有细微的差 异而不是整数值,所以需要对时间秒数触发数值进行一些增加秒数,以补齐数值获取造成的差异,满足要求的时间数值。
7.CV2的设置保存帧率与while循环帧时间不对齐问题
8.cap.set(6, cv2.VideoWriter.fourcc(‘M’, ‘J’, ‘P’, ‘G’)) 视频的编码格式问题
解决办法:
1.cv2摄像头的曝光速度过长,需要按摄像头的合适(最小)曝光时间调整 :
cap2.set(cv2.CAP_PROP_EXPOSURE, -4);#曝光度调节多少秒
2.cv2摄像头的缓冲帧过多,需要更改缓冲帧数量
cap2.set(cv2.CAP_PROP_BUFFERSIZE, 1)#缓冲帧数量大小
3.ret2, frame2 = cap2.read()在第一次读取数据时,会有延迟问题出现,可以在cap2.read()执行后,进行变量标记位 cztime=1,重置执行开始时间变量并使用continue跳出本次循环进行下一次循环。
while True:
#if timemiao<60:
ret2, frame2 = cap2.read()
#缓冲延时
if cztime==0:
cztime=1
last_time=time.time()
continue
4.cv2.waitKey的延时时间值需要对每一次while循环读帧进行动态修改
由于每次读取帧的时间都不一定是相同的,所以需要设置一个最大帧耗时作为参考点,让其他帧 的耗 时与之相同,达到帧时相等的效果,便于计算帧量和帧时,用于统一视频帧时的长度值 ,需要用cv2.waitKey的延时毫秒数值。
一般这个延时帧秒数值放在while循环的结尾处:
zxtime=time.time()-timein
cv2.waitKey(int((zhentime-zxtime)*1000))
5.while一次整个代码循环体的执行速度,同样会拖累延迟执行的时间标准性由于电脑CPU的计算能力 不同,代码长度和难度的不同,执行一次代码需要用到的时间也是不一样的。
所以我们要在while的循环开始和结尾获取时间得到每一次执行的时长,便于和帧时进行同步调整,计算时长。
zxtime=time.time()-timein
cv2.waitKey(int((zhentime-zxtime)*1000))
6.以time分钟作为触发保存条件,由于time.time()读取的是毫秒级数值,会出现读取的数值有细微的差异而不是整数值,所以需要对时间秒数触发数值进行一些增加秒数,以补齐数值获取造成的差异,满足时间数值。
timemiao=timein-last_time #判断是多少秒
if timemiao<61:
7.CV2的设置保存帧率与while循环帧时间不对齐问题
cv2.VideoWriter(bottomvideopath, fourcc, frame_rate, (640, 480))中的fourcc帧率,是用来设置cv2保存时的帧率大小的,当while的执行帧时间长度过长时,会使得每次保存的帧数少于保存帧率,比如while限定录取1分钟,只能保存600帧,而CV设置的保存帧率是12帧,那么就需要12*60=720帧,按12帧率对齐保存,会使得整个帧时视频不足1分钟,我们就需要降低CV的保存帧率,或者提高while的执行时间速度,(如将while循环一次执行周期缩短至0.1秒达到满足帧率10的要求),尽可能的压缩while循环时间中的代码时间浪费问题,把执行时间压缩到与保存帧率相匹配的帧率时长。
如果while循环保存帧时间过快,而帧率数值太小,就会导致1分钟执行时长,保存的帧数量却成了大于1分钟的情况出现。
8.cap.set(6, cv2.VideoWriter.fourcc(‘M’, ‘J’, ‘P’, ‘G’)) 这一行代码的作用是设置视频对象 (cap) 的编码格式。
解释:
cap:通常是一个通过 cv2.VideoCapture() 创建的视频捕捉对象,用于从摄像头或视频文件读取视频帧。
set(6, ...):cap.set() 是用于设置视频捕捉对象的一些参数。数字 6 是指设置参数的标识符,具体是 CAP_PROP_FOURCC,用于设置视频捕捉或写入的编解码器(codec)。
cv2.VideoWriter.fourcc('M', 'J', 'P', 'G'):cv2.VideoWriter.fourcc() 是一个函数,用于指定视频的编码格式。它接