opencv与网络摄像头的坑

本文最后更新于 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去打开

安装ZLMediaKit

这里只写在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


# 安装
# 是在ZLMediaKit目录下哦
mkdir build
cd build
cmake ..
make

# 运行
cd ZLMediaKit/release/linux/Debug
#通过-h可以了解启动参数
./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,照理说不应该有这明显的坑,不知道正规流程是啥,目前不得不转格式。


opencv与网络摄像头的坑
https://blog.kala.love/posts/d60b9cef/
作者
久远·卡拉
发布于
2022年6月30日
许可协议