天天看点

音视频-srs-国标-接入平台类型

SRS GB28181专栏目录

  1. https://www.yuque.com/docs/share/343bdcaf-8138-4a49-8721-1b0bfb3e605d?# 《SRS GB28181专栏目录》
  2. https://www.yuque.com/docs/share/d74c90d9-2006-4de6-9305-0069ca229585?# 《音视频-srs-国标-clion单步调试方法》
  3. https://www.yuque.com/docs/share/d2d031d2-cf6c-49c9-b63d-0fd2e97c0c98?# 《音视频-srs-国标-接入海康NVR、抓包、单步调试、改源码》
  4. https://www.yuque.com/docs/share/48850c17-9bf3-4eb9-8abe-e301ef1fdff2?# 《音视频-srs-国标-接入海康NVR 部分通道未显示问题》
  5. https://www.yuque.com/docs/share/0b41a847-a16b-4a64-a40d-7c81aafb93de?# 《音视频-srs-国标-接入平台类型》

背景

需要接入宇视vms平台的国标,感觉其实和海康大华平台应该都差不多,因为国标协议本来不复杂,关键是一些sip字段问题。

实验环境

为了便于抓包直观理解,我们需要把srs部署在本地的虚拟机里,而平台都在外网,所以要把本地的端口映射到公网去。

音视频-srs-国标-接入平台类型

运行代码

kill -9 $(sudo lsof -t -i:18107)

./objs/srs -c conf/push.gb28181.conf # 正常启动

音视频-srs-国标-接入平台类型

抓收流端口看看,一堆udp,也不知道是什么?

音视频-srs-国标-接入平台类型

理解代码

群里同学提示有同学贡献了平台代码,所以这是一个非常好的学习机会,因为只有看懂了,处理各种平台对接的问题。

常用命令

sudo kill -9 $(sudo lsof -t -i:18107)

./configure --with-gb28181 && make # configure一次就好了,只要make

git remote set-url origin https://github.com/ossrs/srs.git && git pull # 这里不和主仓库自动同步,而是手工把pr代码挪到代码里,这个过程中学习

./objs/srs -c conf/push.gb28181.conf # 正常启动

下面就来理解这两个issue里的讨论:

srs_code_note/srs_gb28181.md at master · xialixin/srs_code_note @xialixin 初始贡献代码

GB28181:支持作为GB/T 28181上级平台; 各种异常和问题修复 by PieerePi · Pull Request #2014 · ossrs/srs @PieerePi

音视频-srs-国标-接入平台类型

下面我们来理解修改的代码,为了解决这个issue,作者提交了1个commit,这一个1个commit里面修改了多个代码文件,目的都是完成这个功能

GB28181:支持作为GB/T 28181上级平台; 各种异常和问题修复 by PieerePi · Pull Request #2014 · ossrs/srs 在这个commit里,我添加了注释

trunk/research/players/srs_gb28181.html

$(selector).val(value). 通过函数设置value 属性

搞了半天发现我下载的代码其实是这个commit之后的,本来还准备边看commit边把代码补全的,现在我不打算这么做了,还是集中解决问题为主,现在的问题就是视频不能播放,而通过抓包是发现有数据向收流端口发送,这个只能是视频数据,也就是rtp数据,所以现在就是要分析这些rtp数据,通过对比NVR的rtp来找到区别。

于是我到网上搜了一下新版Wireshark解析RTP码流包(UDP)

ip.src==192.168.10.44 or ip.dst==192.168.10.44 and !(ip.dst==239.255.255.250) and !(ip.dst==255.255.255.255)

音视频-srs-国标-接入平台类型

打开视频流分析,那里面一堆红色错误是什么?

音视频-srs-国标-接入平台类型

对比测试下nvr的,复制出一份push.gb28181.nvr.conf,把里面的端口统一减一个数:

cd trunk

kill -9 $(sudo lsof -t -i:18007)

./objs/srs -c conf/push.gb28181.nvr.conf # nvr,注意把推流地址改正确了

tail -f ./objs/srs.nvr.log

ip.src==192.168.10.44 or ip.dst==192.168.10.44 and !(ip.dst==239.255.255.250) and !(ip.dst==255.255.255.255)

http://192.168.10.44:18011/players/srs_gb28181.html

http://192.168.10.44:18010

然后invite一路下

不过好像不能启动两个srs,估计是配置里的一些参数冲突了

音视频-srs-国标-接入平台类型

我们暂停wireshark的抓包,然后再开一个wireshark的窗口,关闭刚才nvr的srs进程,重新开一个srs接收平台的推流

kill -9 $(sudo lsof -t -i:18007)

kill -9 $(sudo lsof -t -i:18107)

./objs/srs -c conf/push.gb28181.platform.conf # 平台

tail -f ./objs/srs.platform.log

ip.src==192.168.10.44 or ip.dst==192.168.10.44 and !(ip.dst==239.255.255.250) and !(ip.dst==255.255.255.255)

http://192.168.10.44:18111/players/srs_gb28181.html

http://192.168.10.44:18110

记得invite一下,抓包如下,这是为什么呢?

音视频-srs-国标-接入平台类型

我觉得首先你要理解rtp,你才能知道发生了什么,所以先看下rtp怎么回事,所以找一篇别人推荐的文章看下应该够了,RTP协议全解析(H264码流和PS流)_对牛乱弹琴-CSDN博客

继续阅读