Toybrick

标题: RtspClient打开rtsp视频无数据回调 [打印本页]

作者: jackO    时间: 2019-6-28 17:32
标题: RtspClient打开rtsp视频无数据回调
问题描述如题,使用rtspClient获取rtsp视频流,在onRtspHandle函数里面接收回调,但是测试发现没有数据回调,rtsp视频流地址测试是正确的。

主要提示UDP_RTP receive timeout. 运行结果如下:

*************begin*********************
[2019/06/28 05:27:46] D/: listening rtp port 37558
[2019/06/28 05:27:46] D/: listening rtcp port 37559
[2019/06/28 05:27:46] D/: listening rtcp port 37549
[2019/06/28 05:27:46] D/: listening rtp port 37548
[2019/06/28 05:27:46] D/: curlto rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream , cli 37548:37558, tcp: 0
[2019/06/28 05:27:47] D/: # FOUND[0] media: video
[2019/06/28 05:27:47] D/: # FOUND[0] control: rtsp://admin:admin123@192.168.2. ... av_stream/trackID=1
[2019/06/28 05:27:47] D/: # FOUND[0] rtpmap: id:96 format:H264 bitrate:90000
[2019/06/28 05:27:47] D/: # TOTAL FOUND  1
[2019/06/28 05:27:47] D/: TRACK [0] : rtsp://admin:admin123@192.168.2. ... av_stream/trackID=1
[2019/06/28 05:27:47] D/: setup 37548 , 37549, uri: rtsp://admin:admin123@192.168.2. ... av_stream/trackID=1
[2019/06/28 05:27:52] W/: (threadRtpFunc in unit_rtsp_client.cpp:122): UDP-RTP receive timeout. rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream ; type = Audio
[2019/06/28 05:27:57] W/: (threadRtpFunc in unit_rtsp_client.cpp:122): UDP-RTP receive timeout. rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream ; type = Video
[2019/06/28 05:27:57] D/: close curl rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream
[2019/06/28 05:27:58] D/: destroying curl rtsp ...
[2019/06/28 05:27:58] D/: destroying curl rtsp ... done
[2019/06/28 05:27:58] D/: ReEnable rtsp client [1] rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream
[2019/06/28 05:27:58] D/: curlto rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream , cli 37548:37558, tcp: 0
[2019/06/28 05:27:58] W/: (threadRtpFunc in unit_rtsp_client.cpp:122): UDP-RTP receive timeout. rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream ; type = Audio
[2019/06/28 05:27:59] D/: # FOUND[0] media: video
[2019/06/28 05:27:59] D/: # FOUND[0] control: rtsp://admin:admin123@192.168.2. ... av_stream/trackID=1
[2019/06/28 05:27:59] D/: # FOUND[0] rtpmap: id:96 format:H264 bitrate:90000
[2019/06/28 05:27:59] D/: # TOTAL FOUND  1
[2019/06/28 05:27:59] D/: TRACK [0] : rtsp://admin:admin123@192.168.2. ... av_stream/trackID=1
[2019/06/28 05:27:59] D/: setup 37548 , 37549, uri: rtsp://admin:admin123@192.168.2. ... av_stream/trackID=1
[2019/06/28 05:28:04] W/: (threadRtpFunc in unit_rtsp_client.cpp:122): UDP-RTP receive timeout. rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream ; type = Audio
[2019/06/28 05:28:10] W/: (threadRtpFunc in unit_rtsp_client.cpp:122): UDP-RTP receive timeout. rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream ; type = Video
[2019/06/28 05:28:10] D/: close curl rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream
[2019/06/28 05:28:10] W/: (threadRtpFunc in unit_rtsp_client.cpp:122): UDP-RTP receive timeout. rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream ; type = Audio

测试代码如下所示:

#include <rockchip/rockchip_rtsp.h>
#include <stdio.h>
#include <unistd.h>

void onRtspHandle(unsigned char* buf, size_t len)
{
        printf("***************************recv***********************************\n");
}


int main()
{
        printf("*************begin*********************\n");
        RtspClient client("rtsp://admin:admin123@192.168.2.133:554/h264/ch1/main/av_stream", "admin", "admin123");
        client.setDataCallback(onRtspHandle);
        client.enable();
        usleep(100000000);
        return 0;
}


作者: jackO    时间: 2019-6-29 14:51
能否请版主回复一下?
作者: jefferyzhang    时间: 2019-7-1 09:22
RtspClient client("rtsp://192.168.2.133:554/h264/ch1/main/av_stream", "admin", "admin123");
后面加了用户名密码了,前面地址不需要写用户名密码。
这个主要原因是摄像头没有数据过来,请问下是否有跨网段。
作者: jackO    时间: 2019-7-1 10:30
jefferyzhang 发表于 2019-7-1 09:22
RtspClient client("rtsp://192.168.2.133:554/h264/ch1/main/av_stream", "admin", "admin123");
后面加 ...

修改成 RtspClient client("rtsp://192.168.2.133:554/h264/ch1/main/av_stream", "admin", "admin123"); 运行也是报同样的错。不存在跨网段的问题,网络肯定是通的。是否和板子固件版本有关呢。我板子烧的是1.3的固件。
作者: jefferyzhang    时间: 2019-7-1 10:54
试下用tcp链接,RtspClient client() 最后一个参数加上true
作者: jackO    时间: 2019-7-1 14:18
本帖最后由 jackO 于 2019-7-1 14:29 编辑
jefferyzhang 发表于 2019-7-1 10:54
试下用tcp链接,RtspClient client() 最后一个参数加上true

重新烧了1.2版本的固件,刚刚那个程序可以运行了,但是接入librockchip_mpp库时,发现报其他错误,代码如下:
#include <rockchip/rockchip_rtsp.h>
#include <rockchip/rockchip_mpp.h>
#include <stdio.h>
#include <unistd.h>#include <cstring>

MppDecoder *dec;

void onRtspHandle(unsigned char* buf, size_t len)
{
        printf("***************************recv***********************************\n");        unsigned char * buffer = new unsigned char[len];
        memcpy(buffer, buf, len);
        dec->ops->enqueue(dec, buffer, len);
        DecFrame *frame = dec->ops->dequeue(dec);
        printf("************width:%d,height:%d,size:%d*************", frame->width, frame->height, frame->size);
        dec->ops->freeFrame(frame);
}


int main()
{
        printf("*************begin*********************\n");
        dec = MppDecoderCreate(DecodeType:ECODE_TYPE_H264);

        RtspClient client("rtsp://192.168.2.133:554/h264/ch1/main/av_stream", "admin", "admin123");
        client.setDataCallback(onRtspHandle);
        client.enable();
        usleep(100000000);
        return 0;
}

回调函数有数据,错误提示为:mppFrame point is NULL。


作者: jackO    时间: 2019-7-1 14:45
版主能否回答一下呢?
作者: addy    时间: 2019-7-1 15:05
并不是每一帧数据都可以解码的。你需要把输入和输出分开。
RTSP回调函数里一直dequeue数据,另外起一个线程来enqueue已经解码好的数据
作者: jackO    时间: 2019-7-1 16:49
addy 发表于 2019-7-1 15:05
并不是每一帧数据都可以解码的。你需要把输入和输出分开。
RTSP回调函数里一直dequeue数据,另外起一个线程 ...

您好,现在我在不同线程中取数据,已经能够解码出数据了,取出的MppFrame数据应该如何显示出来呢,我是解码的H264的rtsp视频。
作者: jackO    时间: 2019-7-1 17:06
版主能回答一下吗,谢谢。
作者: troy    时间: 2019-7-2 17:19
jackO 发表于 2019-7-1 17:06
版主能回答一下吗,谢谢。

MPP解码出来的是NV12格式的数据,可以使用RGA装换成BGR888的格式,然后把数据设置到cv:Mat的对象中,在使用opencv的imshow显示出来。
关于如何将data数据转换成cv::Mat对象,可以参考https://blog.csdn.net/qq_33628827/article/details/85765508
作者: mayipeng    时间: 2019-8-1 14:33
jackO 发表于 2019-7-1 16:49
您好,现在我在不同线程中取数据,已经能够解码出数据了,取出的MppFrame数据应该如何显示出来呢,我是解 ...

您好,我也使用海康的摄像头,遇到了同样的问题,请问您是怎么解决的?
作者: zhanghq    时间: 2019-8-9 15:03
jefferyzhang 发表于 2019-7-1 10:54
试下用tcp链接,RtspClient client() 最后一个参数加上true

构造函数只有三个参数,没有加true的地方啊
作者: albertzys    时间: 2020-1-2 11:44
jefferyzhang 发表于 2019-7-1 10:54
试下用tcp链接,RtspClient client() 最后一个参数加上true

版主好,用官网localRTSP demo测试,从海康摄像头取流,每隔一段时间就会出现帧错误现象,表现为视频卡顿3秒。我们其他系统用海康摄像头,ffmpeg取流时,都是设置为tcp连接,设置为udp连接会有丢包卡顿现象。请问RtspClient如何设置连接为tcp模式?看.h文件RtspClient()只有三个参数啊。
作者: jefferyzhang    时间: 2020-1-2 12:03
albertzys 发表于 2020-1-2 11:44
版主好,用官网localRTSP demo测试,从海康摄像头取流,每隔一段时间就会出现帧错误现象,表现为视频卡顿 ...

我问过写这代码的人好像没做tcp模式。
建议你用其他的库来做rtsp请求,这个库也只是个快速开发的demo,以后都没人维护了




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