# SRS学习-部署SRS(GB28181版)
# 介绍
SRS是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181。
单点版架构图如下所示

# 需求分析
我现在有个需求,在项目中我们会接入实时的视频监控摄像头,摄像头基本上都是支持RTSP格式推流,但这个格式的RTSP是没办法在谷歌内核的浏览器上使用的,所以我们需要使用一个集中的流转换服务,将流转换成web可以使用的格式,并且还需要保证流的实时性和稳定性。之前我使用过nginx-rtmp推流(.m3u8格式的),但时效性不行延时有点高。最后我选择了使用SRS来实现推流服务器。
# 思路分析
这里我的摄像头是海康的,遵循GB/T28181 (opens new window)规范。我准备将摄像头直接推流到SRS服务器上,中间不再使用FFmpeg (opens new window)进行推流,这样时效性会好很多能做到准实时的。最后从SRS服务器中拿到.flv格式的视频流,前台就可以使用flv.js来加载视频了。SRS甚至支持WebRTC,这个我们后面再说。
# 环境安装
# 下载安装包
srs-gb28181 (opens new window),这里我选用SRS-gb版本的源码来进行安装

将安装包解压放到linux服务器上(我这里是centos7)

进入trunk目录,执行如下命令完成代码编译
./configure --gb28181=on
完成如下所示

make

软件至此已经编译完成了
# 配置SRS(GB28181)
SRS流媒体服务器中和GB28181相关的配置在conf目录下的push.gb28181.conf文件中,内容如下:
# push gb28181 stream to SRS.
listen 1935; ## RTMP服务端口号,可用于拉取28181的推流数据
max_connections 1000;
daemon off;
srs_log_tank console; ## 表示服务在控制台运行,方便看日志
http_api { ## SRS提供了标准的HTTP API接口,可用于触发GB28181-SIP信令
enabled on;
listen 1985;
}
http_server { ## HTTP Server用于支持HLS拉流
enabled on;
listen 8080;
}
stats {
network 0;
}
stream_caster {
enabled on;
caster gb28181; ## 打开GB28181功能
# 转发流到rtmp服务器地址与端口
# TODO: https://github.com/ossrs/srs/pull/1679/files#r400875104
# [stream] is VideoChannelCodecID(视频通道编码ID) for sip
# 自动创建的道通[stream] 是‘chid[ssrc]’ [ssrc]是rtp的ssrc
# [ssrc] rtp中的ssrc
output rtmp://127.0.0.1:1935/live/[stream];
# 接收设备端rtp流的多路复用端口
listen 9000;
# 多路复用端口类型,on为tcp,off为udp
# 默认:on
tcp_enable on;
# rtp接收监听端口范围,最小值
rtp_port_min 58200;
# rtp接收监听端口范围,最大值
rtp_port_max 58300;
# 是否等待关键帧之后,再转发,
# off:不需等待,直接转发
# on:等第一个关键帧后,再转发
wait_keyframe on;
# rtp包空闲等待时间,如果指定时间没有收到任何包
# rtp监听连接自动停止,发送BYE命令
rtp_idle_timeout 30;
# 是否转发音频流
# 目前只支持aac格式,所以需要设备支持aac格式
# on:转发音频
# off:不转发音频,只有视频
# *注意*!!!:flv 只支持11025 22050 44100 三种
# 如果设备端没有三种中任何一个,转发时为自动选择一种格式
# 同时也会将adts的头封装在flv aac raw数据中
# 这样的话播放器为自动通过adts头自动选择采样频率
# 像ffplay, vlc都可以,但是flash是没有声音,
# 因为flash,只支持11025 22050 44100
audio_enable off;
# 服务器主机号,可以域名或ip地址
# 也就是设备端将媒体发送的地址,如果是服务器是内外网
# 需要写外网地址,
# 调用api创建stream session时返回ip地址也是host
# $CANDIDATE 是系统环境变量,从环境变量获取地址,如果没有配置,用*
# *代表指定stats network 的网卡号地址,如果没有配置network,默认则是第0号网卡地址
# TODO: https://github.com/ossrs/srs/pull/1679/files#r400917594
host $CANDIDATE;
#根据收到ps rtp包自带创建rtmp媒体通道,不需要api接口创建
#rtmp地址参数[stream] 就是通道id 格式chid[ssrc]
auto_create_channel off;
sip {
# 是否启用srs内部sip信令
# 为on信令走srs, off 只转发ps流
enabled on;
# sip监听udp端口
listen 5060;
# SIP server ID(SIP服务器ID).
# 设备端配置编号需要与该值一致,否则无法注册
serial 34020000002000000001;
# SIP server domain(SIP服务器域)
realm 3402000000;
# 服务端发送ack后,接收回应的超时时间,单位为秒
# 如果指定时间没有回应,认为失败
ack_timeout 30;
# 设备心跳维持时间,如果指定时间内(秒)没有接收一个心跳
# 认为设备离线
keepalive_timeout 120;
# 注册之后是否自动给设备端发送invite
# on: 是 off 不是,需要通过api控制
auto_play on;
# 设备将流发送的端口,是否固定
# on 发送流到多路复用端口 如9000
# off 自动从rtp_mix_port - rtp_max_port 之间的值中
# 选一个可以用的端口
invite_port_fixed on;
# 向设备或下级域查询设备列表的间隔,单位(秒)
# 默认60秒
query_catalog_interval 60;
}
}
rtc_server {
enabled on;
# Listen at udp://8000
listen 8000;
#
# The $CANDIDATE means fetch from env, if not configed, use * as default.
#
# The * means retrieving server IP automatically, from all network interfaces,
# @see https://github.com/ossrs/srs/issues/307#issuecomment-599028124
candidate $CANDIDATE;
}
vhost __defaultVhost__ {
rtc { ## 打开WebRTC功能
enabled on;
bframe discard;
}
http_remux { ## 打开HTTP-Flv功能
enabled on;
mount [vhost]/[app]/[stream].flv;
}
}
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# 启动服务
前台启动服务
cd trunk
./objs/srs -c ./conf/push.gb28181.conf
2
后台启动服务
nohup ./objs/srs -c ./conf/push.gb28181.conf >/dev/null 2>&1 &
# 访问服务
默认端口为8080 http://ip:8080/

进入SRS

# 海康摄像头配置GB28181
# 配置摄像头
海康摄像头一般都有可访问的web页面
默认id地址为64,这里我的是:http://192.168.1.64/
登录界面如下:

默认账号密码:admin/12345(可能不一致哈)
主页面如下:

点击配置:

点击网络->高级设置->平台接入

这里SIP服务器地址设置为刚刚部署好的SRS服务器地址,配置如上所示
SIP用户名可以根据自己的需求来设置
没有问题的话,注册状态可以看到为在线
# 效果如下
在SRS控制台下可以看到刚刚注册好的摄像头

