基于SRS的RTMP分发技术方案
生活随笔
收集整理的這篇文章主要介紹了
基于SRS的RTMP分发技术方案
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、采集
SRS支持兩種方式得到RTMP直播源。一種是使用FFmpeg, 設(shè)備或其它方式將流推送到SRS。
另一種方式是SRS本身帶采集功能。
采集(Ingest)指的是將文件(flv,mp4,mkv,avi,rmvb等等),
流(RTMP,RTMPT,RTMPS,RTSP,HTTP,HLS等等),設(shè)備等的數(shù)據(jù),
轉(zhuǎn)封裝為RTMP流(若編碼不是h264/aac則需要轉(zhuǎn)碼),推送到SRS。
采集基本上就是使用FFMPEG作為編碼器,或者轉(zhuǎn)封裝器,將外部流主動(dòng)抓取到SRS。
采集的部署實(shí)例參考:Ingest
1.1 應(yīng)用場(chǎng)景
采集的主要應(yīng)用場(chǎng)景包括:1.虛擬直播: ? ? ?
? 將文件編碼為直播流。可以指定多個(gè)文件后,SRS會(huì)循環(huán)播放。
2.RTSP攝像頭對(duì)接:
? 以前安防攝像頭都支持訪問RTSP地址,RTSP無(wú)法在互聯(lián)網(wǎng)播放。
? 可以將RTSP采集后,以RTMP推送到SRS,后面的東西就不用講了。
3.直接采集設(shè)備: ?
? SRS采集功能可以作為編碼器采集設(shè)備上的未壓縮圖像數(shù)據(jù),
? 譬如video4linux和alsa設(shè)備,編碼為h264/aac后輸出RTMP到SRS。
4.將HTTP流采集為RTMP:
? 有些老的設(shè)備,能輸出HTTP的ts或FLV流,可以采集后轉(zhuǎn)封裝為RTMP,支持HLS輸出。
總之,采集的應(yīng)用場(chǎng)景主要是“SRS拉流”;
能拉任意的流,只要ffmpeg支持;
不是h264/aac都沒有關(guān)系,ffmpeg能轉(zhuǎn)碼。
SRS默認(rèn)是支持“推流”,即等待編碼器推流上來(lái),
可以是專門的編碼設(shè)備,FMLE,ffmpeg,xsplit,flash等等。
如此,SRS的接入方式可以是“推流到SRS”和“SRS主動(dòng)拉流”,
基本上作為源站的功能就完善了。
1.2 編譯
Ingest需要在編譯時(shí)打開:--with-ingest。參考:BuildIngest默認(rèn)使用自帶的ffmpeg,也可以不編譯ffmpeg,使用自己的編轉(zhuǎn)碼工具。
禁用默認(rèn)的ffmpeg在編譯時(shí)指定--without-ffmpeg即可。
參考:Build
1.3 配置
Ingest的配置如下:vhost your_vhost {
? ? # ingest file/stream/device then push to SRS over RTMP.
? ? # the name/id used to identify the ingest, must be unique in global.
? ? # ingest id is used in reload or http api management.
? ? ingest livestream {
? ? ? ? # whether enabled ingest features
? ? ? ? # default: off
? ? ? ? enabled ? ? ?on;
? ? ? ? # input file/stream/device
? ? ? ? # @remark only support one input.
? ? ? ? input {
? ? ? ? ? ? # the type of input.
? ? ? ? ? ? # can be file/stream/device, that is,
? ? ? ? ? ? # ? file: ingest file specifies by url.
? ? ? ? ? ? # ? stream: ingest stream specifeis by url.
? ? ? ? ? ? # ? device: not support yet.
? ? ? ? ? ? # default: file
? ? ? ? ? ? type ? ?file;
? ? ? ? ? ? # the url of file/stream.
? ? ? ? ? ? url ? ? ./doc/source.200kbps.768x320.flv;
? ? ? ? }
? ? ? ? # the ffmpeg?
? ? ? ? ffmpeg ? ? ?./objs/ffmpeg/bin/ffmpeg;
? ? ? ? # the transcode engine, @see all.transcode.srs.com
? ? ? ? # @remark, the output is specified following.
? ? ? ? engine {
? ? ? ? ? ? # @see enabled of transcode engine.
? ? ? ? ? ? # if disabled or vcodec/acodec not specified, use copy.
? ? ? ? ? ? # default: off.
? ? ? ? ? ? enabled ? ? ? ? ?off;
? ? ? ? ? ? # output stream. variables:
? ? ? ? ? ? # [vhost] current vhost which start the ingest.
? ? ? ? ? ? # [port] system RTMP stream port.
? ? ? ? ? ? output ? ? ? ? ?rtmp://127.0.0.1:[port]/live?vhost=[vhost]/livestream;
? ? ? ? }
? ? }
}
ingest指令后面是ingest的id,全局需要唯一,用來(lái)標(biāo)識(shí)這個(gè)ingest。
在reload/http-api管理時(shí)才知道操作的是哪個(gè)。
譬如,reload時(shí)用來(lái)檢測(cè)哪些ingest更新了,需要通知那些已經(jīng)存在的ingest,停止已經(jīng)不存在的ingest。
其中,type指定了輸入的幾種類型:
file: ? ?輸入為文件,url指定了文件的路徑。srs會(huì)給ffmpeg傳遞-re參數(shù)。
stream: ?輸入為流,url指定了流地址。
device: ?暫時(shí)不支持。
engine: 指定了轉(zhuǎn)碼引擎參數(shù):
enabled: 指定是否轉(zhuǎn)碼,若off或者vcodec/acodec沒有指定,則不轉(zhuǎn)碼,使用ffmpeg-copy。
output: 輸出路徑。
? ? ? ? ?有兩個(gè)變量可以使用:
? ? ? ? ? ?port為系統(tǒng)偵聽的RTMP端口,
? ? ? ? ? ?vhost為配置了ingest的vhost。
其他參考轉(zhuǎn)碼的配置:FFMPEG
注意:engine默認(rèn)為copy,當(dāng):
engine的enabled為off,沒有開啟轉(zhuǎn)碼engine,則使用copy。
engine的vcodec/acodec沒有指定,則使用copy。
采集多個(gè)文件。
實(shí)現(xiàn)方法:
可以把輸入文件變成文件列表。自己寫工具實(shí)現(xiàn)采集列表。
二、Forward模式搭建小型集群
srs定位為直播服務(wù)器,其中一項(xiàng)重要的功能是forward,即將服務(wù)器的流轉(zhuǎn)發(fā)到其他服務(wù)器。備注:SRS的邊緣RTMP參考Edge,支持訪問時(shí)回源,為大規(guī)模并發(fā)提供最佳解決方案。
注意:edge可以從源站拉流,也可以將流轉(zhuǎn)發(fā)給源站。
? ? ? 也就是說(shuō),播放edge上的流時(shí),edge會(huì)向源站拉流;
? ? ? 推流到edge上時(shí),edge會(huì)直接將流轉(zhuǎn)發(fā)給源站。
注意:若只需要中轉(zhuǎn)流給源站,不必用forward,直接使用edge模式即可。
? ? ? 可以直接支持推流和拉流的中轉(zhuǎn),簡(jiǎn)單快捷。
? ? ? Forward應(yīng)用于目標(biāo)服務(wù)器是多個(gè),譬如將一路流主動(dòng)送給多路服務(wù)器;
? ? ? edge雖然配置了多臺(tái)服務(wù)器,但是只用了一臺(tái),有故障時(shí)才切換。
注意:優(yōu)先使用edge,除非知道必須用forward,才使用forward。
forward本身是用做熱備,即用戶推一路流上來(lái),可以被SRS轉(zhuǎn)發(fā)(或者轉(zhuǎn)碼后轉(zhuǎn)發(fā))到多個(gè)slave源站,
CDN邊緣可以拉多個(gè)slave源站的流,實(shí)現(xiàn)故障熱備的功能,構(gòu)建強(qiáng)容錯(cuò)系統(tǒng)。
轉(zhuǎn)發(fā)的部署實(shí)例參考:Usage: Forward
2.1 詞匯
為了和edge方式區(qū)分,forward定義一次詞匯如下:master:主服務(wù)器,
? ? ? ? 編碼器推流到這個(gè)服務(wù)器,或者用ingest流到服務(wù)器。
? ? ? ? 總之,master就是主服務(wù)器,負(fù)責(zé)轉(zhuǎn)發(fā)流給其他服務(wù)器。
slave: 從服務(wù)器,主服務(wù)器轉(zhuǎn)發(fā)流到這個(gè)服務(wù)器。
如果結(jié)合edge集群方式,一般而言master和slave都是origin(源站服務(wù)器),
edge邊緣服務(wù)器可以從master或者slave回源取流。
實(shí)際上master和slave也可以是edge,但是不推薦,這種組合方式太多了,測(cè)試沒有辦法覆蓋到。
因此,強(qiáng)烈建議簡(jiǎn)化服務(wù)器的結(jié)構(gòu),只有origin(源站服務(wù)器)才配置轉(zhuǎn)發(fā),edge(邊緣服務(wù)器)只做邊緣。
2.2 For Small Cluster
forward也可以用作搭建小型集群。架構(gòu)圖如下:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+-------------+ ? ?+---------------+
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+-->+ Slave(1935) +->--+ ?Player(3000) +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? +-------------+ ? ?+---------------+
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? +-------------+ ? ?+---------------+
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|-->+ Slave(1936) +->--+ ?Player(3000) +
? ? ? ? ?publish ? ? ? forward | ? +-------------+ ? ?+---------------+
+-----------+ ? ?+--------+ ? ?| ? ? 192.168.1.6 ? ? ? ? ? ? ? ? ? ? ??
| ?Encoder ?+-->-+ Master +-->-| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
+-----------+ ? ?+--------+ ? ?| ? +-------------+ ? ?+---------------+
?192.168.1.3 ? ?192.168.1.5 ? ?+-->+ Slave(1935) +->--+ ?Player(3000) +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? +-------------+ ? ?+---------------+
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? +-------------+ ? ?+---------------+
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+-->+ Slave(1936) +->--+ ?Player(3000) +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+-------------+ ? ?+---------------+
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?192.168.1.7 ? ? ? ? ? ? ? ? ? ? ? ? ?
2.3 下面是搭建小型集群的實(shí)例。
1. Encoder編碼器編碼器使用FFMPEG推流。編碼參數(shù)如下:
for((;;)); do\
? ? ./objs/ffmpeg/bin/ffmpeg \
? ? -re -i doc/source.200kbps.768x320.flv \
? ? -vcodec copy -acodec copy \
? ? -f flv -y rtmp://192.168.1.5:1935/live/livestream; \
done
2. SRS-Master服務(wù)器
SRS(192.168.1.5)的配置如下:
listen ? ? ? ? ? ? ?1935;
pid ? ? ? ? ? ? ? ? ./objs/srs.pid;
max_connections ? ? 10240;
vhost __defaultVhost__ {
? ? gop_cache ? ? ? on;
? ? forward ? ? ? ? 192.168.1.6:1935 192.168.1.6:1936 192.168.1.7:1935 192.168.1.7:1936;
}
源站的流地址播放地址是:rtmp://192.168.1.5/live/livestream
將流forward到兩個(gè)邊緣節(jié)點(diǎn)上。
3. SRS-Slave節(jié)點(diǎn)
Slave節(jié)點(diǎn)啟動(dòng)多個(gè)SRS的進(jìn)程,每個(gè)進(jìn)程一個(gè)配置文件,偵聽不同的端口。
以192.168.1.6的配置為例,需要偵聽1935和1936端口。
配置文件srs.1935.conf配置如下:
listen ? ? ? ? ? ? ?1935;
pid ? ? ? ? ? ? ? ? ./objs/srs.1935.pid;
max_connections ? ? 10240;
vhost __defaultVhost__ {
? ? gop_cache ? ? ? on;
}
配置文件srs.1936.conf配置如下:
listen ? ? ? ? ? ? ?1936;
pid ? ? ? ? ? ? ? ? ./objs/srs.1936.pid;
max_connections ? ? 10240;
vhost __defaultVhost__ {
? ? gop_cache ? ? ? on;
}
啟動(dòng)兩個(gè)SRS進(jìn)程:
nohup ./objs/srs -c srs.1935.conf >/dev/null 2>&1 &
nohup ./objs/srs -c srs.1936.conf >/dev/null 2>&1 &
播放器可以隨機(jī)播放著兩個(gè)流:
rtmp://192.168.1.6:1935/live/livestream
rtmp://192.168.1.6:1936/live/livestream
另外一個(gè)Slave節(jié)點(diǎn)192.168.1.7的配置和192.168.1.6一樣。
4. 服務(wù)的流
此架構(gòu)服務(wù)中的流為:
流地址 服務(wù)器 端口 連接數(shù)
rtmp://192.168.1.6:1935/live/livestream 192.168.1.6 1935 3000
rtmp://192.168.1.6:1936/live/livestream 192.168.1.6 1936 3000
rtmp://192.168.1.7:1935/live/livestream 192.168.1.7 1935 3000
rtmp://192.168.1.7:1936/live/livestream 192.168.1.7 1936 3000
這個(gè)架構(gòu)每個(gè)節(jié)點(diǎn)可以支撐6000個(gè)并發(fā),兩個(gè)節(jié)點(diǎn)可以支撐1.2萬(wàn)并發(fā)。 還可以加端口,可以支持更多并發(fā)。
2.4. Forward VS Edge
Forward架構(gòu)和CDN架構(gòu)的最大區(qū)別在于,CDN屬于大規(guī)模集群,邊緣節(jié)點(diǎn)會(huì)有成千上萬(wàn)臺(tái),源站2臺(tái)(做熱備),還需要有中間層。
CDN的客戶很多,流也會(huì)有很多。
所以假若源站將每個(gè)流都轉(zhuǎn)發(fā)給邊緣,會(huì)造成巨大的浪費(fèi)(有很多流只有少數(shù)節(jié)點(diǎn)需要)。
可見,forward只適用于所有邊緣節(jié)點(diǎn)都需要所有的流。CDN是某些邊緣節(jié)點(diǎn)需要某些流。
forward的瓶頸在于流的數(shù)目,假設(shè)每個(gè)SRS只偵聽一個(gè)端口:
系統(tǒng)中流的數(shù)目 = 編碼器的流數(shù)目 × 節(jié)點(diǎn)數(shù)目 × 端口數(shù)目
考慮5個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)起4個(gè)端口,即有20個(gè)SRS邊緣。編碼器出5路流,則有20 * 5 = 100路流。
同樣的架構(gòu),對(duì)于CDN的邊緣節(jié)點(diǎn)來(lái)講,系統(tǒng)的流數(shù)為用戶訪問邊緣節(jié)點(diǎn)的流,
假設(shè)沒有用戶訪問,系統(tǒng)中就沒有流量。某個(gè)區(qū)域的用戶訪問某個(gè)節(jié)點(diǎn)上的流,
系統(tǒng)中只有一路流,而不是forward廣播式的多路流。
另外,forward需要播放器隨機(jī)訪問多個(gè)端口,實(shí)現(xiàn)負(fù)載均衡,或者播放器訪問api服務(wù)器,
api服務(wù)器實(shí)現(xiàn)負(fù)載均衡,對(duì)于CDN來(lái)講也不合適(需要客戶改播放器)。
總之,forward適用于小型規(guī)模的集群,不適用于CDN大規(guī)模集群應(yīng)用。
2.5 高級(jí)應(yīng)用
forward還可以結(jié)合hls和transcoder功能使用,即在源站將流轉(zhuǎn)碼,然后forward到Slave節(jié)點(diǎn),Slave節(jié)點(diǎn)支持rtmp同時(shí)切HLS。
因?yàn)橛脩敉粕蟻?lái)的流,或者編碼器(譬如FMLE)可能不是h264+aac,
需要先轉(zhuǎn)碼為h264+aac(可以只轉(zhuǎn)碼音頻)后才能切片為hls。
需要結(jié)合vhost,先將流transcode送到另外一個(gè)vhost,這個(gè)vhost將流轉(zhuǎn)發(fā)到Slave。
這樣可以只轉(zhuǎn)發(fā)轉(zhuǎn)碼的流。
參考vhost,hls和transcoder相關(guān)wiki。
三、Edge邊緣服務(wù)器
SRS的Edge提供訪問時(shí)回源機(jī)制,在CDN/VDN等流眾多的應(yīng)用場(chǎng)景中有重大意義,?forward/ingest方案會(huì)造成大量帶寬浪費(fèi)。
同時(shí),SRS的Edge能對(duì)接所有的RTMP源站服務(wù)器,?
不像FMS的Edge只能對(duì)接FMS源站(有私有協(xié)議);
另外,SRS的Edge支持SRS源站的所有邏輯 (譬如轉(zhuǎn)碼,轉(zhuǎn)發(fā),HLS,DVR等等),
也就是說(shuō)可以選擇在源站切片HLS,也可以直接在邊緣切片HLS。
備注:Edge一般負(fù)載高,SRS支持的并發(fā)足夠跑滿千兆網(wǎng)帶寬了。
3.1 Edge的主要應(yīng)用場(chǎng)景:
CDN/VDN大規(guī)模集群,客戶眾多流眾多需要按需回源。小規(guī)模集群,但是流比較多,需要按需回源。
骨干帶寬低,邊緣服務(wù)器強(qiáng)悍,可以使用多層edge,降低上層BGP帶寬。
注意1.:
edge可以從源站拉流,也可以將流轉(zhuǎn)發(fā)給源站。
也就是說(shuō),播放edge上的流時(shí),edge會(huì)回源拉流;
推流到edge上時(shí),edge會(huì)直接將流轉(zhuǎn)發(fā)給源站。
注意2.:
若只需要中轉(zhuǎn)流給源站,不必用forward,直接使用edge模式即可。
可以直接支持推流 和拉流的中轉(zhuǎn),簡(jiǎn)單快捷。
Forward應(yīng)用于目標(biāo)服務(wù)器是多個(gè),譬如將一路流主動(dòng)送給多路服務(wù)器;
edge雖然配置了多臺(tái)服務(wù)器,但是只用了一臺(tái),有故障時(shí)才切換。
注意:優(yōu)先使用edge,除非知道必須用forward,才使用forward。
3.2 概念
所謂邊緣edge服務(wù)器,就是邊緣直播緩存服務(wù)器,配置時(shí)指定為remote模式和origin(指定一個(gè)或多個(gè)源站IP),
這個(gè)邊緣edge服務(wù)器就是源站的緩存了。
當(dāng)用戶推流到邊緣服務(wù)器時(shí),邊緣直接將流轉(zhuǎn)發(fā)給源站。
譬如源站在北京BGP機(jī)房,湖南有個(gè)電信ADSL用戶要推流發(fā)布自己的直播流,
要是直接推流到北京BGP可能效果不是很好,可以在湖南電信機(jī)房部署一個(gè)邊緣,
用戶推流到湖南邊緣,邊緣轉(zhuǎn)發(fā)給北京源站BGP。
當(dāng)用戶播放邊緣服務(wù)器的流時(shí),邊緣服務(wù)器看有沒有緩存,若緩存了就直接將流發(fā)給客戶端。?
若沒有緩存,則發(fā)起一路回源鏈接,從源站取數(shù)據(jù)源源不斷放到自己的緩存隊(duì)列。
也就是說(shuō), 多個(gè)客戶端連接到邊緣時(shí),只有一路回源。
這種結(jié)構(gòu)在CDN是最典型的部署結(jié)構(gòu)。
譬如北京源站, 在全國(guó)32個(gè)省每個(gè)省都部署了10臺(tái)服務(wù)器,
一共就有320臺(tái)邊緣,假設(shè)每個(gè)省1臺(tái)邊緣服務(wù)器都有2000用戶觀看,那么就有64萬(wàn)用戶,
每秒鐘集群發(fā)送640Gbps數(shù)據(jù);而回源鏈接只有320個(gè),實(shí)現(xiàn)了大規(guī)模分發(fā)。
邊緣edge服務(wù)器,實(shí)際上是解決大并發(fā)問題產(chǎn)生的分布式集群結(jié)構(gòu)。
SRS的邊緣可以指定多個(gè)源站,在源站出現(xiàn)故障時(shí)會(huì)自動(dòng)切換到下一個(gè)源站,
不影響用戶觀看,具有最佳的容錯(cuò)性,用戶完全不會(huì)覺察。
3.3 Config
edge屬于vhost的配置,將某個(gè)vhost配置為edge后,該vhost會(huì)回源取流(播放時(shí))或者將流轉(zhuǎn)發(fā) 給源站(發(fā)布時(shí))。
vhost __defaultVhost__ {
? ? # the mode of vhost, local or remote.
? ? # ? ? ? local: vhost is origin vhost, which provides stream source.
? ? # ? ? ? remote: vhost is edge vhost, which pull/push to origin.
? ? # default: local
? ? mode ? ? ? ? ? ?remote;
? ? # for edge(remote mode), user must specifies the origin server
? ? # format as: [:port]
? ? # @remark user can specifies multiple origin for error backup, by space,
? ? # for example, 192.168.1.100:1935 192.168.1.101:1935 192.168.1.102:1935
? ? origin ? ? ? ? ?127.0.0.1:1935 localhost:1935;
? ? # for edge, whether open the token traverse mode,
? ? # if token traverse on, all connections of edge will forward to origin to check(auth),
? ? # it's very important for the edge to do the token auth.
? ? # the better way is use http callback to do the token auth by the edge,
? ? # but if user prefer origin check(auth), the token_traverse if better solution.
? ? # default: off
? ? token_traverse ?off;
}
可配置多個(gè)源站,在故障時(shí)會(huì)切換到下一個(gè)源站。
3.4 集群配置
下面舉例說(shuō)明如何配置一個(gè)源站和集群。源站配置,參考o(jì)rigin.conf:
listen ? ? ? ? ? ? ?19350;
pid ? ? ? ? ? ? ? ? objs/origin.pid;
srs_log_file ? ? ? ?./objs/origin.log;
vhost __defaultVhost__ {
}
邊緣配置,參考edge.conf:
listen ? ? ? ? ? ? ?1935;
pid ? ? ? ? ? ? ? ? objs/edge.pid;
srs_log_file ? ? ? ?./objs/edge.log;
vhost __defaultVhost__ {
? ? mode ? ? ? ? ? ?remote;
? ? origin ? ? ? ? ?127.0.0.1:19350;
}
3.5 HLS邊緣
Edge指的是RTMP邊緣,也就是說(shuō),配置為Edge后,流推送到源站(Origin)時(shí),Edge不會(huì)切片生成HLS。HLS切片配置在源站,只有源站會(huì)在推流上來(lái)就產(chǎn)生HLS切片。
邊緣只有在訪問時(shí)才會(huì)回源(這個(gè)時(shí)候 也會(huì)生成HLS,但單獨(dú)訪問邊緣的HLS是不行的)。
也就是說(shuō),HLS的邊緣需要使用WEB服務(wù)器緩存,譬如nginx反向代理,squid,或者traffic server等。
3.6 下行邊緣結(jié)構(gòu)設(shè)計(jì)
下行邊緣指的是下行加速邊緣,即客戶端播放邊緣服務(wù)器的流,邊緣服務(wù)器從上層或源站取流。SRS下行邊緣是非常重要的功能,需要考慮以下因素:
以后支持多進(jìn)程時(shí)結(jié)構(gòu)變動(dòng)最小。
和目前所有功能的對(duì)接良好。
支持平滑切換,源站和邊緣兩種角色。
權(quán)衡后,SRS下行邊緣的結(jié)構(gòu)設(shè)計(jì)如下:
客戶端連接到SRS
開始播放SRS的流
若流存在則直接播放。
若流不存在,則從源站開始取流。
其他其他流的功能,譬如轉(zhuǎn)碼/轉(zhuǎn)發(fā)/采集等等。
核心原則是:
邊緣服務(wù)器在沒有流時(shí),向源站拉取流。
當(dāng)流建立起來(lái)后,邊緣完全變成源站服務(wù)器,對(duì)流的處理邏輯保持一致。
支持回多個(gè)源站,錯(cuò)誤時(shí)切換。這樣可以支持上層服務(wù)器熱備。
備注:RTMP多進(jìn)程(計(jì)劃中)的核心原則是用多進(jìn)程作為完全鏡像代理,
連接到本地的服務(wù)器 (源站或邊緣),完全不考慮其他業(yè)務(wù)因素,透明代理。
這樣可以簡(jiǎn)單,而且利用多CPU能力。 HTTP多進(jìn)程是不考慮支持的,用NGINX是最好選擇,
SRS的HTTP服務(wù)器只是用在嵌入式設(shè)備中, 沒有性能要求的場(chǎng)合。
3.7 上行邊緣結(jié)構(gòu)設(shè)計(jì)
上行邊緣指的是上行推流加速,客戶端推流到邊緣服務(wù)器,邊緣將流轉(zhuǎn)發(fā)給源站服務(wù)器。考慮到下行和上行可能同時(shí)發(fā)生在一臺(tái)邊緣服務(wù)器,所以上行邊緣只能用最簡(jiǎn)單的代理方式,?
完全將流代理到上層或源站服務(wù)器。也就是說(shuō),只有在下行邊緣時(shí),邊緣服務(wù)器才會(huì)啟用其他的功能,
譬如HLS轉(zhuǎn)發(fā)等等。
上行邊緣主要流程是:
客戶端連接到SRS
開始推流到SRS。
開始轉(zhuǎn)發(fā)到源站服務(wù)器。
EdgeState
邊緣的狀態(tài)圖分析如下:
RTMP-HLS-latency
注意:這種細(xì)節(jié)的文檔很難保持不變,以代碼為準(zhǔn)。
3.8 邊緣的難點(diǎn)
RTMP邊緣對(duì)于SRS來(lái)講問題不大,主要是混合了reload和HLS功能的邊緣服務(wù)器,會(huì)是一個(gè)難點(diǎn)。譬如,用戶在訪問邊緣上的HLS流時(shí),是使用nginx反向代理回源,還是使用RTMP回源后在邊緣切片??
對(duì)于前者,需要部署srs作為RTMP邊緣,nginx作為HLS邊緣,管理兩個(gè)服務(wù)器自然是比一個(gè)要費(fèi)勁。?
若使用后者,即RTMP回源后邊緣切片,能節(jié)省骨干帶寬,只有一路回源,
難點(diǎn)在于訪問HLS時(shí)要發(fā)起 RTMP回源連接。
正因?yàn)闃I(yè)務(wù)邏輯會(huì)是邊緣服務(wù)器的難點(diǎn),所以SRS對(duì)于上行邊緣,采取直接代理方式,
并沒有采取 邊緣緩存方式。所謂邊緣緩存方式,即推流到邊緣時(shí)邊緣也會(huì)當(dāng)作源站直接緩存(作為源站),?
然后轉(zhuǎn)發(fā)給源站。邊緣緩存方式看起來(lái)先進(jìn),這個(gè)邊緣節(jié)點(diǎn)不必回源,實(shí)際上加大了集群的邏輯難度,?
不如直接作為代理方式簡(jiǎn)單。
四、RTMP 集群(源/邊緣) 架構(gòu)
SRS集群支持兩種模式: forward 和 edge步驟一:
Any RTMP encoder push RTMP stream to RTMP (origin/edge)server,
? ? where SRS RTMP Edge server will forward stream to origin.
RTMP編碼器推送RTMP流有兩個(gè)目的地址:
1. RTMP源服務(wù)器,
2. SRS RTMP邊緣服務(wù)器;
? ?推送到SRS RTMP邊緣服務(wù)器的RTMP流會(huì)被再forward到RTMP源服務(wù)器;
+---------+ ? ? ? +-----------------+ ? ? +-----------------------+?
+ Encoder +--+-->-+ ?SRS(RTMP Edge) +--->-+ ? ? (RTMP Origin) ? ? |?
+---------+ ?| ? ?+-----------------+ ? ? | ? SRS/FMS/NGINX-RTMP ?|
? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?Red5/HELIX/CRTMP ? |
? ? ? ? ? ? ?+-------------------------->-+ ? ? ? ? ...... ? ? ? ?|
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? +-----------------------+?
步驟二:
SRS邊緣服務(wù)器從RTMP源服務(wù)器或上游SRS邊緣服務(wù)器拉流,
這時(shí),當(dāng)前的SRS邊緣服務(wù)器即可以為客戶端提供直播播放服務(wù),
也可以做為下一級(jí)SRS邊緣服務(wù)器的源;
+-------------+ ? ?+-----------------+ ? ? ?+--------------------+
| RTMP Origin +-->-+ ?SRS(RTMP Edge) +--+->-+ ?Client(RTMP/HLS) ?|
+-------------+ ? ?+-----------------+ ?| ? | ?Flash/IOS/Android |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? +--------------------+
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? +-----------------+
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? +->-+ ?SRS(RTMP Edge) +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? +-----------------+
總結(jié)
以上是生活随笔為你收集整理的基于SRS的RTMP分发技术方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: srs代码学习(1)--listen建立
- 下一篇: RTMP的URL/Vhost规则