CSDN搬家的旧文!
使用librtmp库将拉取监控的rtsp流推送给srs服务器,发现一个异常,在长时间大概1个月后发现系统内存被srs吃满,也不知道是什么原因产生的这个现象,并且通过top去查看srs的内存在持续增长,通过ffmpeg推流没有这个现象,感觉还是librtmp使用的问题,暂时也没有很好的思路分析;
通过查看srs的git库,发现srs提供了一个srs-librtmp的源码库,能完成推送h264裸流的功能,然后尝试使用这个库推送流到srs,发现srs的内存没有明显的增长,所以就选择换成srs-librtmp的推流库来推流,并且srs-librtmp的接口使用非常简单;
使用srs-librtmp推流也碰到新的问题,是srs-librtmp是根据NALU单元来发送video数据,但我们的视频包是多SLICE,也就是一个I帧会有多个0x65的slice,VLC播放器只能显示出一张图片的上半部分,不能完整显示,原来是和ffmpeg编码时的thread参数有关系,将 c->thread_type = 1;//FF_THREAD_SLICE;//just 1 thread encode for 1 slice ,VLC就能正常解码;主要参考: https://blog.csdn.net/wupengqiangqinli/article/details/51200927 ,这篇博文的作者对多slice能否正常在rtmp推流中使用表示了担心,果然如作者所说,所以修改为单线程编码后功能正常;
另外,公司采购了新的海康球形机,默认开启rtsp的认证,但使用MD5认证使用认证失败,一直返回401,刚开始怀疑是MD5算法的问题,参考:https://yq.aliyun.com/articles/243675中的计算md5的方式,算出来的MD5值也是一样的,正好对rtsp的md5认证的算法也有了了解:
RTSP客户端应该使用username + password并计算response如下:
(1)当password为MD5编码,则
response = md5( password:nonce:md5(public_method:url) );
(2)当password为ANSI字符串,则
response= md5( md5(username:realm:password):nonce:md5(public_method:url) );
但问题还是没有找到,最后发现是配置地址和实际的url地址不一致,少了一部分,并且xml解析的时候还有报错,但被忽略了,原来是在xml中配置该球形机取流的rtsp地址有问题,该球形机的取流地址是:rtsp://11.12.115.118:554/Streaming/Channels/101?transportmode=unicast&profile=Profile_1
如果在xml文件中配置,发现解析的时候提示:EntityRef: expecting ';'错误;需要将url中的条件分割符&写成& 也就是:
rtsp://11.12.115.118:554/Streaming/Channels/101?transportmode=unicast& profile=Profile_1
这样子修改之后,认证和取流就都正常了。
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com