发布时间:2024-10-16 18:01
opencv是调用的windows系统或ffmpeg等库的编码器。通过RTSP使用单进程进行采集的时候,偶尔会出现如下的报错,并且存在丢帧,卡帧的现象。
[h26a Search Terminal Help rNULL 0x556ef3666a801non-existing PPS 2referenced
0x556ef40f22c01 non-existingPPS2referenced
Th264 Qx556ef40f22c01 decode_slice_header error
video.py [h264 0x556ef40f22c0 no franel
Th264 9x556ef38474c0 error while decoding MB14026,bytestream
Th264 ox556ef3do9cc0 error while decodingMB5 3,bytestream -5
width:2560hetoht: 1440
ubuntudoc OpenCV:FFMPEG:tag0x47504a4d/\'MJPG\' is not supported with codecid 7 and forma Mo4 MP4 CMPEC-4
Part 14) ker 七 OpencV:FFMPEG:fallback to use tag 0x7634706d/\'mp4v Save
Th264 0x5610c887f2c01eFTOrwhiledecoding MB107 59.bytestream-21
Th264 0×561089005C91error whiledecodingMB33 64,bytestream -5
「rtsp 0x5610c7cC8aC01Undefined type (31) o,channe
ACTraceback(most error whiledecoding MB123 27,bytestream -5
G
9×5610863e5c01
read.py Th264
line caLLlast):
File\"read.ov\".recent
? out.write(frame】 21,in smodule>
KevboardInterrupt
出现上面的问题,初步分析为由于网络问题造成的。
使用多进程保存视频,发现上述问题解决了。但是发现存在的问题是我们通过编码后视频在很短的时间内,需要消耗很大的存储空间。
问题分析:
我们在存储视频的时候是通过一帧一帧的图像合并成视频,所以视频的体积变大了。接下来我们就去剖析一下视频编码、解码的原理。
视频编解码的过程是指对数字视频进行压缩或解压缩的一个过程。
为什么要进行视频编码?
伴随着用户对高清视频的需求量的增加,视频多媒体的视频数据量也在不断加大。如果未经压缩,这些视频很难应用于实际的存储和传输。
视频编码的两个基本条件:
数据冗余。例如如空间冗余、时间冗余、结构冗余、信息熵冗余等,即图像的各像素之间存在着很强的相关性。消除这些冗余并不会导致信息损失,属于无损压缩。
视觉冗余。人眼的一些特性比如亮度辨别阈值,视觉阈值,对亮度和色度的敏感度不同,使得在编码的时候引入适量的误差,也不会被察觉出来。可以利用人眼的视觉特性,以一定的客观失真换取数据压缩。这种压缩属于有损压缩。
常见的视频编码格式:
H.26X 系列:H.261、H.262、H.263、H.264、H.265
MPEG 系列:MPEG-2、MPEG-4
H265编码将是后期发展的方向
通过上述理论知识的掌握,我们通过合适的编码方式就可以将采集的视频压缩到一个合适的体积。
常用的编码参数如下:
cv2.VideoWriter_fourcc(‘I’,‘4’,‘2’,‘0’)—未压缩的YUV颜色编码,4:2:0色度子采样。兼容性好,但文件较大。文件扩展名.avi。
cv2.VideoWriter_fourcc(‘P’,‘I’,‘M’,‘1’)—MPEG-1编码类型,文件扩展名.avi。随机访问,灵活的帧率、可变的图像尺寸、定义了I-帧、P-帧和B-帧 、运动补偿可跨越多个帧 、半像素精度的运动向量 、量化矩阵、GOF结构 、slice结构 、技术细节、输入视频格式。
cv2.VideoWriter_fourcc(‘X’,‘V’,‘I’,‘D’)—MPEG-4编码类型,视频大小为平均值,MPEG4所需要的空间是MPEG1或M-JPEG的1/10,它对运动物体可以保证有良好的清晰度,间/时间/画质具有可调性。文件扩展名.avi。
cv2.VideoWriter_fourcc(‘T’,‘H’,‘E’,‘O’)—OGGVorbis,音频压缩格式,有损压缩,类似于MP3等的音乐格式。,兼容性差,件扩展名.ogv。
cv2.VideoWriter_fourcc(‘F’,‘L’,‘V’,‘1’)—FLV是FLASH VIDEO的简称,FLV流媒体格式是一种新的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等缺点。文件扩展名为.flv。
fourcc = cv2.VideoWriter_fourcc(*\'MJPG\')
fourcc = cv2.VideoWriter_fourcc(*\'mp4v\')
fourcc = cv2.VideoWriter_fourcc(*\'XVID\')
fourcc = cv2.VideoWriter_fourcc(*\'avc1\')
使用*\'MJPG’编码视频,视频大小为492M,然而使用*\'XVID’视频编码,视频的大小为90.3M。‘MJPG’/‘XVID’ = 5.45
cap.release()
out.release()
cv2.destroyAllWindows()