SRS
SRS定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码
- 项目日志文档:https://github.com/ossrs/srs/wiki/v1_CN_SrsLog
- 项目代码:https://github.com/ossrs/srs
- 推流客户端:
https://obsproject.com/
采用的是 RTMP是Real Time Messaging Protocol(实时消息传输协议) - VLC多媒体播放器
下载地址:
http://www.videolan.org/
1 概念
边缘edge服务器
就是直播缓存服务器
上行Edge边缘服务器
湖南有个 电信ADSL用户要推流发布自己的直播流,要是直接推流到北京BGP可能效果不是很好,
可以在 湖南电信机房部署一个边缘,用户推流到湖南边缘,边缘转发给北京源站BGP
湖南机房就是边缘edge服务器
上行Edge特点:
- 对流直接转发 不做任何处理
下行Edge边缘服务器
假设北京部署源站
在全国32个省每个省都部署了10台服务器,一共就有320台边缘,
每个省1台边缘服务器都有 2000用户观看,那么就有64万用户,每秒钟集群发送640Gbps数据;
而回源链接只有320个,
也就是说, 多个客户端连接到边缘时,只有一路回源
why why
当用户播放边缘服务器的流时,边缘服务器看有没有缓存,若缓存了就直接将流发给客户端
(有缓存直接播放 不从需要拉去操作不产生回源)
若没有缓存,则发起一路回源链接,从源站取数据源源不断放到自己的缓存队列。
也就是说, 多个客户端连接到边缘时,只有一路回源
日志:
-
对于客户端连接没有产生回源
RTMP client ip=127.0.0.1 source url=/live/, ip=127.0.0.1 , cache=1, is_edge=0, source_id=-1[-1]
-
对于客户端连接产生回源
RTMP client ip=127.0.0.1
source url=/live/, ip=10.44.88.99, cache=1, is_edge=0, source_id=157[157] -
srs服务发生中断 客户端流没有发生变化 更新汇源地址
[2017-07-10 11:30:29.972][trace][1095][172] RTMP client ip=10.69.56.169
[2017-07-10 11:30:30.264][trace][1095][172] client identified, type=Play, stream_name=, duration=-1.00
[2017-07-10 11:30:30.264][trace][1095][172] source url=/live/, ip=10.69.56.169, cache=1, is_edge=0, source_id=166[166]
[2017-07-10 13:57:57.609][trace][1095][178] update source_id=184[184]
```
下行边缘特点:
- 容错性
SRS的边缘可以指定多个源站,
在源站出现故障时会自动切换到下一个源站,不影响用户观看
客户度流不发生改变 重新读取故障后的流
- 高并发
> 多个客户端看同一视频, 只要产生一回源
这说法错误 一个socket连接是不考虑里面传输具体内容的
###HLS边缘服务器
-----------------------------------------------------------------------
###什么是HLS
>HTTP Live Streaming(缩写是HLS)基于HTTP的流媒体网络传输协议。
它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些
HLS切片配置在源站,只有源站会在推流上来就产生HLS切片(上行推流端的不会产生)
边缘只有在访问时才会回源(这个时候 也会生成HLS)
也就是说,HLS的边缘需要使用WEB服务器缓存,
譬如nginx反向代理,squid,或者traffic server等。
why 不懂
The ngx_http_hls_module module provides HTTP Live Streaming (HLS)
HLS边缘服务器根据hls协议进程切割流视频
## 2 流程图:
###上行边缘主要流程是:
- 客户端连接到SRS
- 开始推流到SRS。
- 开始转发到源站服务器
###下行边缘的主要流程是:
- 客户端连接到SRS
- 开始播放SRS的流
- 若流存在则直接播放。
- 若流不存在,则从源站开始取流。
其他其他流的功能,譬如转码/转发/采集等等。
核心原则是:
- 边缘服务器在没有流时,向源站拉取流。
- 当流建立起来后,边缘完全变成源站服务器,对流的处理逻辑保持一致。
- 支持回多个源站,错误时切换。这样可以支持上层服务器热备
### 源站
![中间节点.png](https://img.haomeiwen.com/i1837968/48934fd0a5d3b5dd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
##集群部署
-----------------------------------------------
下面举例说明如何配置一个源站和集群。
- 边缘配置参考edge.conf:
>listen 19360; //边缘服务器端口
max_connections 1000;
external_ip 10.112.78.192:19360;
vhost __defaultVhost__ {
mode remote;
origin 10.112.78.190:19350; //指定源站服务器地址和端口
}
- 源站配置,参考origin.conf:
>listen 19350;
pid objs/origin.pid;
srs_log_file ./objs/origin.log;
vhost __defaultVhost__ {
}
./objs/srs -c conf/edge.conf
推流:
![image.png](https://img.haomeiwen.com/i1837968/329dcd368f7755d1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
播放:
![image.png](https://img.haomeiwen.com/i1837968/8bbc21c1fce2f37e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
说明:
- 推送边缘服务 播放源站服务 push --edg(10.112.78.33)--orig(10.112.78.99)--play
rtmp://10.112.78.33:19360/live
rtmp://10.112.78.99:19360/live
参考
1直播数据分析 http://www.chnvideo.com/blog-classic-data.html
2 项目日志文档:https://github.com/ossrs/srs/wiki/v1_CN_SrsLog
3 https://github.com/ossrs/srs/wiki/v1_CN_Edge
网友评论