本文最后更新于 2022年10月19日 上午
在使用rtsp协议传输H264编码视频时,opencv无法打开摄像头的问题
坑
最近在研究人脸识别,开始的时候是在平板上安装DroidCam,把上面的摄像头变为能够通过http打开的网络摄像头,视频编码是MJPG,一直用没啥问题。最近要切换到rtsp协议H264编码的海康摄像头上, 坑就来了。
1 2 3
| [h264 @ 0x562dc937eb80] decode_slice_header error [h264 @ 0x562dc937eb80] no frame! [h264 @ 0x562dc937eb80] non-existing PPS 0 referenced
|
在使用cv2.VideoCapture打开摄像头时,会报该错误,搜索遍了网络也没找到解答,于是便只能自己摸索
首先上面的报错实际来自于ffmpeg,当使用该工具直接保存rtsp流视频时,一开始会出现上面错误,之后正常工作。猜测源编码可能有类似与包头的东西,当未能读取到包头,那么之后的数据均无法解析,所以开始一直出错,之后读取到了包头,那么后面的数据能够解析于是正常工作。于是我想着是不是能opecv重复去打开,结果是不行的。
那么换一种传输方式如何呢?
尝试
使用ZLMediaKit
和
FFmpeg,将rtsp转成rtmp,再让opencv去打开
这里只写在ubuntu下的安装流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| git clone https://github.com/ZLMediaKit/ZLMediaKit.git cd ZLMediaKit git submodule update --init
sudo apt install build-essential sudo apt install cmake sudo apt install libssl-dev sudo apt install libsdl-dev sudo apt install libavcodec-dev sudo apt install libavutil-dev sudo apt install ffmpeg
mkdir build cd build cmake .. make
cd ZLMediaKit/release/linux/Debug
./MediaServer -h
./MediaServer -d &
|
测试
要使用tcp不然疯狂丢包
1
| ffmpeg -rtsp_transport tcp -i rtsp://192.168.2.2:554/cc -vcodec copy -f flv -an rtmp://192.168.2.206/live/test
|
运行后需要等待一会儿,原因也是上面说的,在显示下面打印信息的时候就可以启动oepncv程序了
1
| frame= 1427 fps= 25 q=-1.0 Lsize= 40905kB time=00:01:53.33 bitrate=2956.6kbits/s speed=1.99x
|
使用rtmp读取摄像头
1
| cap = cv2.VideoCapture("rtmp://192.168.2.206/live/test")
|
出画面,可行~但是作为通用rtsp和H264,照理说不应该有这明显的坑,不知道正规流程是啥,目前不得不转格式。