Toybrick

标题: 贡献RtspClient库 [打印本页]

作者: zhuyuliang0    时间: 2021-10-12 15:22
标题: 贡献RtspClient库
本帖最后由 zhuyuliang0 于 2021-10-18 14:20 编辑

鉴于官方的rtspclient库demo不开源,自己通过gstreamer实现了一个rtspclient库。目前测试了几天,修复了一些bug,比较稳定。
特点:
    1.gstreamer架构:流程 rtspsrc->decodebin(mpp)->tee->queue->appsink->rga
    2.c/c++开发
    3.cpython调用
    4.解决了h265mpp对齐问题
    5.解决了多线程调用问题。支持RTSP输出分辨率
        * 640 * 480
        * 1280 * 720
        * 1920 * 1080
        * 2560 * 1440
        * 3840 * 2160
    6.目前尽支持测试大华摄像头和海康威视摄像头直连

rockchip平台依赖环境
    1.[MPP](https://t.rock-chips.com/forum.p ... d=336&highlight=mpp)
    2.[RGA](https://t.rock-chips.com/forum.p ... d=333&highlight=rga)
    3.[MPP_GSTREAMER插件](https://github.com/rockchip-linux/gstreamer-rockchip)

开发者可根据自己的特殊情况进行开发。欢迎一起维护。

GitHub地址








作者: jefferyzhang    时间: 2021-10-13 10:16
赞,rtsp用gst是比较推荐的方式,rk那个是徒手写的交互用的demo,兼容性很差
作者: hhhjjjwww    时间: 2021-10-14 11:39
哥们你好,这个项目里面include是不是少了个头文件?我编译的时候出错了,提示少了arrayqueue.h 这个文件
CMake Error at CMakeLists.txt:88 (add_executable):
  Cannot find source file:

    ./include/arrayqueue.h
作者: zhuyuliang0    时间: 2021-10-14 15:20
hhhjjjwww 发表于 2021-10-14 11:39
哥们你好,这个项目里面include是不是少了个头文件?我编译的时候出错了,提示少了arrayqueue.h 这个文件
C ...

可以去掉,已经废弃了
作者: hhhjjjwww    时间: 2021-10-14 16:55
本帖最后由 hhhjjjwww 于 2021-10-14 17:00 编辑
zhuyuliang0 发表于 2021-10-14 15:20
可以去掉,已经废弃了

你好,你程序在我的rk3399prod上编译成功了,但是framedata.size一直都是0,请问这是什么原因,用vlc能够打开rtsp流
作者: hhhjjjwww    时间: 2021-10-14 16:57
本帖最后由 hhhjjjwww 于 2021-10-14 16:59 编辑

[attach]2092[/attach]
作者: zhuyuliang0    时间: 2021-10-14 17:29
hhhjjjwww 发表于 2021-10-14 16:57

是不是rtsp流的分辨率不对应,我看你使用的是子码流,目前只支持720p,1080p, 2k的分辨率,其他的分辨率暂时没有处理,720p不用修改分辨率直接转换,具体可以看源码。gst_rtsp_client.cpp 871行开始
作者: hhhjjjwww    时间: 2021-10-14 17:45
我在gst_rtsp_client.cpp RtspClient::read函数里面打印map_info.size的值一直输出3110400,但是你的处理里面并没有对map_info.size=3110400这种情况进行处理。
作者: hhhjjjwww    时间: 2021-10-14 17:53
zhuyuliang0 发表于 2021-10-14 17:29
是不是rtsp流的分辨率不对应,我看你使用的是子码流,目前只支持720p,1080p, 2k的分辨率,其他的分辨率 ...

换成主码流也一样
作者: zhuyuliang0    时间: 2021-10-14 17:55
hhhjjjwww 发表于 2021-10-14 17:45
我在gst_rtsp_client.cpp RtspClient::read函数里面打印map_info.size的值一直输出3110400,但是你的处理里 ...

那应该是你的rtsp流的分辨率不匹配,你可以根据h254和h265情况下得子码流分辨率自己去匹配map_info.size=3110400(width*height*2)去看一下你nvr的子码流的分辨率是多少,然后在read里面用rga转换的时候自己处理下就行。或者你告诉我下你的子码流分辨率我添加一下支持。
作者: zhuyuliang0    时间: 2021-10-14 18:06
zhuyuliang0 发表于 2021-10-14 17:55
那应该是你的rtsp流的分辨率不匹配,你可以根据h254和h265情况下得子码流分辨率自己去匹配map_info.size= ...

比如h265 2560*1440的情况下,mpp输出的是2816*1440,要用rga进行,转换,裁剪才行,
而h264 2560 * 1440的情况下,mpp输出是正常的,可以用rga直接转换就可以,
所以要针对不同的分辨率做在h265和h264不同的处理,这也是比较麻烦的地方。
作者: zhuyuliang0    时间: 2021-10-14 18:08
hhhjjjwww 发表于 2021-10-14 17:53
换成主码流也一样

换主码流,要保证rtsp的分辨率是对应支持的分辨率才可以。
作者: hhhjjjwww    时间: 2021-10-15 09:03
本帖最后由 hhhjjjwww 于 2021-10-15 09:12 编辑
zhuyuliang0 发表于 2021-10-14 17:55
那应该是你的rtsp流的分辨率不匹配,你可以根据h254和h265情况下得子码流分辨率自己去匹配map_info.size= ...

主码流1920*1080,h264 MPEG格式 ,但是map_info.size依然是3110400,1920*1080*2也不等于3110400

作者: zhuyuliang0    时间: 2021-10-15 09:13
本帖最后由 zhuyuliang0 于 2021-10-15 09:15 编辑
hhhjjjwww 发表于 2021-10-15 09:03
主码流1920*1080,但是map_info.size依然是3110400,1920*1080*2也不等于3110400

是乘以3,不是2,打错了 看一下你的rtsp是h265的还是h264的,
h264情况下1920 * 1080 mpp输出的是 1920 * 1088 * 3 map_info.size == 4177920
h265情况下1920 * 1080 mpp输出的是 2304 * 1080 * 3 map_info.size == 4976640
可能是你的rtsp编码模式不对吧,可以看一下摄像头rtsp后台的设置吗 比如:
[attach]2093[/attach]
作者: hhhjjjwww    时间: 2021-10-15 09:30
本帖最后由 hhhjjjwww 于 2021-10-15 09:31 编辑
zhuyuliang0 发表于 2021-10-15 09:13
是乘以3,不是2,打错了 看一下你的rtsp是h265的还是h264的,
h264情况下1920 * 1080 mpp输出的是 1920  ...

[attach]2094[/attach]
这个是我的vlc码流信息,请您看看有什么问题?


另外1920*1088*3=6266880?怎么等于4177920?

作者: zhuyuliang0    时间: 2021-10-15 10:21
hhhjjjwww 发表于 2021-10-15 09:30
这个是我的vlc码流信息,请您看看有什么问题?

1.关于计算问题
如果是RK_FORMAT_YCrCb_420_SP 是乘以2
如果转换RK_FORMAT_RGB_888后 是乘以3

2.rtsp如果是通过NVR录像机输出的这个还没有测试,之前用官方的demo的rtspclient测试nvr录像机解析是不稳定的不知道是不是mpp的问题!
可以使用rtsp摄像头直连试试,并且进摄像头管理页面看看配置是否正常。
作者: zhuyuliang0    时间: 2021-10-15 10:37
hhhjjjwww 发表于 2021-10-15 09:30
这个是我的vlc码流信息,请您看看有什么问题?

这个是我海康录像机输出的效果,用的软件是Mac的VLC[attach]2097[/attach]


作者: hhhjjjwww    时间: 2021-10-15 10:54
zhuyuliang0 发表于 2021-10-15 10:21
1.关于计算问题
如果是RK_FORMAT_YCrCb_420_SP 是乘以2
如果转换RK_FORMAT_RGB_888后 是乘以3

感谢你的建议,我将rtsp摄像头改成直连,用官方的local_rtsp那个代码居然可以了,但是您代码还是输出显示map_info.size=3110400
作者: hhhjjjwww    时间: 2021-10-15 10:58
zhuyuliang0 发表于 2021-10-15 10:37
这个是我海康录像机输出的效果,用的软件是Mac的VLC

我在ubuntu 用vlc显示正常,用直连或者nvr都可以显示,也是用海康摄像头
作者: zhuyuliang0    时间: 2021-10-15 11:03
hhhjjjwww 发表于 2021-10-15 10:54
感谢你的建议,我将rtsp摄像头改成直连,用官方的local_rtsp那个代码居然可以了,但是您代码还是输出显示m ...

可以尝试打印下GstVideoInfo info;的信息,查看一下视频信息,可能会有所帮助。
作者: hhhjjjwww    时间: 2021-10-15 11:48
zhuyuliang0 发表于 2021-10-15 11:03
可以尝试打印下GstVideoInfo info;的信息,查看一下视频信息,可能会有所帮助。 ...

[attach]2099[/attach][attach]2099[/attach]这个是打印gstvideoinfo 的部分信息,请您看看

作者: hhhjjjwww    时间: 2021-10-15 11:50
zhuyuliang0 发表于 2021-10-15 11:03
可以尝试打印下GstVideoInfo info;的信息,查看一下视频信息,可能会有所帮助。 ...

[attach]2100[/attach]这是gstvideoinfo 部分打印信息,请您看看


作者: hhhjjjwww    时间: 2021-10-15 11:58
zhuyuliang0 发表于 2021-10-15 11:03
可以尝试打印下GstVideoInfo info;的信息,查看一下视频信息,可能会有所帮助。 ...

frame data size :0
*map info size: 3110400GstVideoInfo height: 1080
GstVideoInfo width: 1920
GstVideoInfo flags: 0
GstVideoInfo fps_d: 1
GstVideoInfo fps_n: 25
GstVideoInfo interlace_mode: 0
GstVideoInfo offset: 0x5594c356d0
GstVideoInfo par_d: 1
GstVideoInfo par_n: 1
GstVideoInfo chroma_site: 2
GstVideoInfo finfo format: 2
GstVideoInfo finfo bits: 8
GstVideoInfo finfo depth: 0x7facebe894
frame data size :0
这是部分打印信息,请您看看
作者: zhuyuliang0    时间: 2021-10-15 12:24
hhhjjjwww 发表于 2021-10-15 11:58
frame data size :0
*map info size: 3110400GstVideoInfo height: 1080
GstVideoInfo width: 1920

gst_rtsp_client.cpp 853行有日志信息,可以放在注释打印。
还有我想在看一下您摄像机的配置页面,看看rtsp流的配置。
作者: hhhjjjwww    时间: 2021-10-15 13:54
zhuyuliang0 发表于 2021-10-15 12:24
gst_rtsp_client.cpp 853行有日志信息,可以放在注释打印。
还有我想在看一下您摄像机的配置页面,看看rt ...

“==”里面的是853行的打印

*===================================
GStreamer video stream information:
  size: 1920 x 1080 pixel
  pixel format: I420  number of planes: 3
  video meta found: yes
===================================
map info size: 3110400
GstVideoInfo height: 1080
GstVideoInfo width: 1920
GstVideoInfo flags: 0
GstVideoInfo fps_d: 1
GstVideoInfo fps_n: 25
GstVideoInfo interlace_mode: 0
GstVideoInfo offset: 0x558dbaa6d0
GstVideoInfo par_d: 1
GstVideoInfo par_n: 1
GstVideoInfo chroma_site: 2
GstVideoInfo finfo format: 2
GstVideoInfo finfo bits: 8
GstVideoInfo finfo depth: 0x7f793dc894
frame data size :0
[attach]2101[/attach]


作者: zhuyuliang0    时间: 2021-10-15 14:31
hhhjjjwww 发表于 2021-10-15 13:54
“==”里面的是853行的打印

*===================================

1.不太确定你的摄像头设备是什么设备,当前我只调试适配了海康和大华的摄像头.
2.您的pixel format: I420,而我输出的都是pixel format: NV12,所以需要您更改rga转换的SRC_FORMAT宏,修改成对应的格式。然后放开限制直接转换。
具体可以参考官方https://github.com/rockchip-linux/linux-rga
[attach]2102[/attach]
3.目前看gstreamer mpp解码到appsink输出都没问题,只是到rga转换的时候出了问题,可以自行在read方法内解决。


作者: zhuyuliang0    时间: 2021-10-15 14:44
zhuyuliang0 发表于 2021-10-15 14:31
1.不太确定你的摄像头设备是什么设备,当前我只调试适配了海康和大华的摄像头.
2.您的pixel format: I420 ...

[attach]2103[/attach]
如果没错的话I420是红框里面这个

作者: hhhjjjwww    时间: 2021-10-15 16:41
本帖最后由 hhhjjjwww 于 2021-10-15 16:55 编辑

[attach]2106[/attach]
zhuyuliang0 发表于 2021-10-15 14:31
1.不太确定你的摄像头设备是什么设备,当前我只调试适配了海康和大华的摄像头.
2.您的pixel format: I420 ...

我强行在else if (map_info.size == 4177920 || map_info.size ==3110400) { 加了一个或的判断,让map_info.size==3110400也能进行处理,然后程序也没有报什么错,然后输出的图像我使用opencv color颜色转换RGB2BGR,结果是这样,颜色有点问题,这个摄像头输出是直连的
[attach]2105[/attach]


nvr的摄像头是这样的图像

[attach]2107[/attach]

作者: zhuyuliang0    时间: 2021-10-15 17:26
hhhjjjwww 发表于 2021-10-15 16:41
我强行在else if (map_info.size == 4177920 || map_info.size ==3110400) { 加了一个或的判断,让map_inf ...

1.nvr我也试过,遇到的问题是不稳定,具体根源在哪里没有深究.
2.目前看你的问题主要是rga格式转换的问题,处理好就可以了,
你将gst_rtsp_client.h的61行改成#define SRC_FORMAT RK_FORMAT_YCrCb_420_P 试试。

作者: hhhjjjwww    时间: 2021-10-15 17:31
zhuyuliang0 发表于 2021-10-15 17:26
1.nvr我也试过,遇到的问题是不稳定,具体根源在哪里没有深究.
2.目前看你的问题主要是rga格式转换的问题 ...

那您觉得会是mpp库的问题吗?
作者: zhuyuliang0    时间: 2021-10-15 17:47
hhhjjjwww 发表于 2021-10-15 17:31
那您觉得会是mpp库的问题吗?

出问题的面不大,我用deepstream也试过,也是类似的问题。
作者: hhhjjjwww    时间: 2021-10-18 10:31
本帖最后由 hhhjjjwww 于 2021-10-18 11:42 编辑
zhuyuliang0 发表于 2021-10-15 17:47
出问题的面不大,我用deepstream也试过,也是类似的问题。

运行您的程序查看了一下cpu的占用率非常高,这个代码没有使用rk3399prod的硬件加速吗?请问解码部分是在哪里?
作者: zhuyuliang0    时间: 2021-10-18 13:39
hhhjjjwww 发表于 2021-10-18 10:31
运行您的程序查看了一下cpu的占用率非常高,这个代码没有使用rk3399prod的硬件加速吗?请问解码部分是在哪 ...

有mpp+rga的,看一下是不是用了opencv导致的,或者IO读写导致的,我测试cpu占用率7%左右一个gst线程。
作者: zhuyuliang0    时间: 2021-10-18 13:46
zhuyuliang0 发表于 2021-10-18 13:39
有mpp+rga的,看一下是不是用了opencv导致的,或者IO读写导致的,我测试cpu占用率7%左右一个gst线程。 ...

另外参考mpp和rga的安装,如果mpp库没有装gst默认使用的是软解码。
https://t.rock-chips.com/forum.p ... 6&highlight=mpp
https://t.rock-chips.com/forum.p ... 3&highlight=rga
作者: zhuyuliang0    时间: 2021-10-18 13:56
hhhjjjwww 发表于 2021-10-18 10:31
运行您的程序查看了一下cpu的占用率非常高,这个代码没有使用rk3399prod的硬件加速吗?请问解码部分是在哪 ...

解码部分,你要安装gst mpp插件的,
地址https://github.com/rockchip-linux/gstreamer-rockchip
否则decodebin不回使用mpp的,并且是软解当然cpu占用高了。
建议你学习gst流程
作者: hhhjjjwww    时间: 2021-10-18 16:55
zhuyuliang0 发表于 2021-10-18 13:46
另外参考mpp和rga的安装,如果mpp库没有装gst默认使用的是软解码。
https://t.rock-chips.com/forum.php? ...

mpp和rga都安装, 但是cpu占用率依然有100%
作者: zhuyuliang0    时间: 2021-10-18 17:21
hhhjjjwww 发表于 2021-10-18 16:55
mpp和rga都安装, 但是cpu占用率依然有100%

gstreamer的mpp插件要装的,否则decodebin插件找不到mppvideodec插件无法硬解码。会用cpu软解码,当然cpu暂用率高了。
作者: hhhjjjwww    时间: 2021-10-18 20:34
zhuyuliang0 发表于 2021-10-18 17:21
gstreamer的mpp插件要装的,否则decodebin插件找不到mppvideodec插件无法硬解码。会用cpu软解码,当然cpu ...

您好,请问有没有教程?安装https://github.com/rockchip-linux/gstreamer-rockchip 好多次,但是cpu占用率还是很高。。。不知道那里安装出问题
作者: hhhjjjwww    时间: 2021-10-19 15:21
本帖最后由 hhhjjjwww 于 2021-10-19 15:50 编辑
zhuyuliang0 发表于 2021-10-18 17:21
gstreamer的mpp插件要装的,否则decodebin插件找不到mppvideodec插件无法硬解码。会用cpu软解码,当然cpu ...

您好,我已经编译好gst_mpp插件了,你看看这个输出安装正确?
[attach]2109[/attach]
加载了这个插件后,cpu占用率从100%降到30~50%左右,但是运行一段时间后就没有接受到数据了,一直循环打印这个:

mpp[7115]: hal_h264d_rkv_reg: control info: fmt 7, w 1920, h 1080
mpp[7115]: mpp_buf_slot: set frame info: w 1920 h 1080 hor 1920 ver 1088
mpp[7115]: mpp_dec: setting default w 1920 h 1080 h_str 1920 v_str 1088
mpp[7115]: h264d_api: is_avcC=1

作者: hhhjjjwww    时间: 2021-10-19 17:06
hhhjjjwww 发表于 2021-10-19 15:21
您好,我已经编译好gst_mpp插件了,你看看这个输出安装正确?

加载了这个插件后,cpu占用率从100%降到30 ...

原来还是nvr和直连的问题,只要是直连,视频拉取都正常,nvr一直有问题
作者: zhuyuliang0    时间: 2021-10-20 07:37
hhhjjjwww 发表于 2021-10-19 17:06
原来还是nvr和直连的问题,只要是直连,视频拉取都正常,nvr一直有问题

不知道和带宽有没有关系
作者: wokafu    时间: 2022-5-5 14:18
感谢大佬,一直在找这个资料!
作者: wokafu    时间: 2022-5-9 20:44
请问作者rga的库是使用的哪一个版本呀!最新的im2d版本使用报错呀
作者: HXB28986628    时间: 2022-8-9 17:36
您好博主,请问您的这个代码可以用python直接调用api来读取rtsp视频流吗
作者: zhuyuliang0    时间: 2022-8-17 17:42
HXB28986628 发表于 2022-8-9 17:36
您好博主,请问您的这个代码可以用python直接调用api来读取rtsp视频流吗

可以,已经为python谢了api接口,但需要依赖必要的软件环境,mpp,rga,gstreamer。
作者: vivid    时间: 2023-3-18 10:51
楼主,我想问一下,最新的C++的demo,如何调用rtsp的图像保存和推流到本地播放?




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3