天天看點

RTMP的URL/Vhost規則

RTMP的url其實很簡單,vhost其實也沒有什麼新的概念,但是對于沒有使用過的同學來講,還是很容易混淆。幾乎每個新人都必問的問題:RTMP那個URL推流時應該填什麼,什麼是vhost,什麼是app?

RTMP和HLS的優勢參考:HLS

應用場景

Vhost的主要應用場景包括:

  • 一個分發網絡支援多個客戶:譬如CDN,一個分發網絡中,有N個客戶公用一套流媒體系統,如何區分使用者,計費,監控等等?通過app麼?大家可能都叫做live之類。最好是通過各自的域名。
  • 不同的應用配置:譬如FMLE推上來的流是h264+mp3,可以将音頻轉碼後放到其他的vhost分發hls,這樣接入h264+mp3的vhost就不用切hls。

總之,vhost作為應用配置的單元,能隔離客戶,應用不同的配置。

标準RTMP URL

标準RTMP URL指的是最大相容的RTMP URL,基本上所有的伺服器和播放器都能識别的URL,和HTTP URL其實很相似,例如:

HTTP Schema Host Port App Stream
http://192.168.1.10:80/players/srs_player.html http 192.168.1.10 80 players srs_player.html
rtmp://192.168.1.10:1935/live/livestream rtmp 1935 live livestream

其中:

  • Schema:協定頭,HTTP為HTTP或HTTPS,RTMP為RTMP/RTMPS/RTMPE/RTMPT等衆多協定,還有新出的RTMFP。
  • Host:主機,表示要連接配接的主機,可以為主機DNS名稱或者IP位址。商用時,一般不會用IP位址,而是DNS名稱,這樣可以用CDN分發内容(CDN一般使用DNS排程,即不同網絡和地理位置的使用者,通過DNS解析到的IP不一樣,實作使用者的就近通路)。
  • Port:端口,HTTP預設為80,RTMP預設為1935。當端口沒有指定時,使用預設端口。
  • Path:路徑,HTTP通路的檔案路徑。
  • App:RTMP的Application(應用)名稱,可以類比為檔案夾。以檔案夾來分類不同的流,沒有特殊約定,可以任意劃分。
  • Stream:RTMP的Stream(流)名稱,可以類比為檔案。

NoVhost

其實,vhost大多數使用者都用不到,而且不推薦用,有點複雜。一般的使用者用app就可以了。因為vhost/app/stream,隻是一個分類方法而已;vhost需要在配置檔案中說明,app/stream都不需要配置。

什麼時候用vhost?如果你是提供服務,譬如你有100個客戶,都要用一套平台,走同樣的流媒體伺服器分發。那可以每個客戶一個vhost,這樣他們的app和stream可以相同都可以。

一般的用法,舉個例子,有個視訊網站,自己搭建伺服器,是以隻有他自己一個客戶,就不要用vhost了,直接用app就足夠了。假設視訊網站提供聊天服務,聊天有不同的話題類型,每個話題就是一個app,譬如:軍事欄目,讀書欄目,曆史欄目三個分類,每個分類下面有很多聊天室。隻要這麼配置就好:

listen              1935;
vhost __defaultVhost__ {
}      

生成網頁時,譬如軍事欄目的網頁,都用app名稱為

military

,某個聊天室叫做

火箭

,這個頁面的流可以用:

rtmp://yourdomain.com/military/rock

,編碼器也推這個流,所有觀看這個

軍事欄目/火箭

聊天室的頁面的人,都播放這個流。

軍事欄目另外的網頁,都用同樣的app名稱

military

,但是流不一樣,譬如某個聊天室叫做

雷達

rtmp://yourdomain.com/military/radar

,推流和觀看一樣。

如此類推,軍事欄目頁面生成時,不用更改srs的任何配置。也就是說,新增聊天室,不用改伺服器配置;新增分類,譬如加個

公開課

的聊天室,也不用改伺服器配置。足夠簡單!

另外,讀書欄目可以用app名稱為

reader

,欄目下的某個聊天室叫

紅樓夢

rtmp://yourdomain.com/reader/red_mansion

,所有在這個聊天室的人都是播放這個流。

Vhost的應用

RTMP的Vhost和HTTP的Vhost概念是一樣的:虛拟主機。詳見下表(假設域名demo.srs.com被解析到IP為192.168.1.10的伺服器):

Vhost
http://demo.srs.com:80/players/srs_player.html demo.srs.com
rtmp://demo.srs.com:1935/live/livestream

Vhost主要的作用是:

  • 支援多使用者:當一台伺服器需要服務多個客戶,譬如CDN有cctv(央視)和wasu(華數傳媒)兩個客戶時,如何隔離他們兩個的資源?相當于不同的使用者共用一台計算機,他們可以在自己的檔案系統建立同樣的檔案目錄結構,但是彼此不會沖突。
  • 域名排程:CDN分發内容時,需要讓使用者通路離自己最近的邊緣節點,邊緣節點再從源站或上層節點擷取資料,達到加速通路的效果。一般的做法就是Host是DNS域名,這樣可以根據使用者的資訊解析到不同的節點。
  • 支援多配置:有時候需要使用不同的配置,考慮一個支援多終端(PC/Apple/Android)的應用,PC上RTMP分發,Apple和Android是HLS分發,如何讓PC延遲最低,同時HLS也能支援,而且終端播放時盡量位址一緻(降低終端開發難度)?可以使用兩個Vhost,PC和HLS;PC配置為最低延遲的RTMP,并且将流轉發給HLS的Vhost,可以對音頻轉碼(可能不是H264/AAC)後切片為HLS。PC和HLS這兩個Vhost的配置肯定是不一樣的,播放時,流名稱是一樣,隻需要使用不同的Host就可以。

Vhost支援多使用者

假設cctv和wasu都運作在一台邊緣節點(192.168.1.10)上,使用者通路這兩個媒體的流時,Vhost的作用見下表:

RTMP
rtmp://show.cctv.cn/live/livestream show.cctv.cn
rtmp://show.wasu.cn/live/livestream show.wasu.cn

在邊緣節點(192.168.1.10)上的SRS,需要配置Vhost,例如:

listen              1935;
vhost show.cctv.cn {
}
vhost show.wasu.cn {
}      

Vhost域名排程

詳細參考DNS和CDN的實作。

Vhost支援多配置

以上面舉的例子,若cctv需要延遲最低(意味着啟動時隻有聲音,畫面是黑屏),而wasu需要快速啟動(打開就能看到視訊,伺服器cache了最後一個gop,延遲會較大)。

隻需要對這兩個Vhost進行不同的配置,例如:

listen              1935;
vhost show.cctv.cn {
    chunk_size 128;
}
vhost show.wasu.cn {
    chunk_size 4906;
}      

總之,這兩個Vhost的配置完全沒有關系,不會互相影響。

__defaultVhost__

FMS的__defaultVhost__是預設的vhost,當使用者請求的vhost沒有比對成功時,若配置了defaultVhost,則使用它來提供服務。若比對失敗,也沒有defaultVhost,則傳回錯誤。

譬如,伺服器192.168.1.10上的SRS配置如下:

listen              1935;
vhost demo.srs.com {
    enabled         on;
}      

那麼,當使用者通路以下vhost時:

  • rtmp://demo.srs.com/live/livestream:成功,比對vhost為demo.srs.com
  • rtmp://192.168.1.10/live/livestream:失敗,沒有找到vhost,也沒有defaultVhost。

defaultVhost和其他vhost的規則一樣,隻是用來比對那些沒有比對成功的vhost的請求的。

通路指定的Vhost

如何通路某台伺服器上的Vhost?有兩個方法:

  • 配置hosts:因為Vhost實際上就是DNS解析,是以可以配置用戶端的hosts,将域名(Vhost)解析到指定的伺服器,就可以通路這台伺服器上的指定的vhost。
  • 使用app的參數:需要伺服器支援。在app後面帶參數指定要通路的Vhost。SRS支援?vhost=VHOST和...vhost...VHOST這兩種方式,後面的方式是避免一些播放器不識别?和=等特殊字元。

普通使用者不用這麼麻煩,直接通路RTMP位址就好了,有時候運維需要看某台機器上的Vhost的流是否有問題,就需要這種特殊的通路方式。考慮下面的例子:

RTMP URL: rtmp://demo.srs.com/live/livestream
邊緣節點數目:50台
邊緣節點IP:192.168.1.100 至 192.168.1.150
邊緣節點SRS配置:
    listen              1935;
    vhost demo.srs.com {
        mode remote;
        origin: xxxxxxx;
    }      

各種通路方式見下表:

使用者 RTMP URL hosts設定 目标
普通使用者 rtmp://demo.srs.com/live/livestream

由DNS

解析到指定邊緣

運維 192.168.1.100 demo.srs.com 檢視192.168.1.100上的流

rtmp://192.168.1.100/live?

vhost=demo.srs.com/livestream

rtmp://192.168.1.100/live

...vhost...demo.srs.com/livestream

通路其他伺服器的流也類似。

The Publish URL of FMLE

FMLE推流時,URL那個地方,有三個可以輸入的框,參考Adobe FMLE:

  • FMS URL: 需要輸入rtmp://host:port/app,例如:rtmp://demo.srs.com/live
  • Backup URL: 備份的伺服器,格式同FMS URL。若指定了備份伺服器,FMLE會同時推送給這兩個伺服器。
  • Stream: 流名稱,例如:livestream

實際上是将RTMP URL分成了兩部分,stream前面那部分和stream。為何要這麼搞?我猜想有以下原因:

  • 支援多級app和Stream:我們目前舉的例子都是一級app和一級stream,實際上RTMP支援多級app和stream,就像子檔案夾,實際上很少用得到。是以SRS的URL都是一個位址,預設最後一個/後面就是stream,前面是app。
  • 支援流名稱帶參數:Adobe的鬼HLS/HDS非常之麻煩,那個位址是個惡心的完全不一緻。參考FMS livepkgr,例如釋出一個rtmp,并切片成HLS:
FMLE:
FMS URL: rtmp://demo.srs.com/livepkgr
Stream: livestream?adbe-live-event=liveevent

Client:
RTMP:  rtmp://demo.srs.com/livepkgr/livestream
HLS: http://demo.srs.com/hls-live/livepkgr/_definst_/liveevent/livestream.m3u8
HDS: http://demo.srs.com/hds-live/livepkgr/_definst_/liveevent/livestream.f4m      

沒有比這個更惡心的東西了。比較SRS的簡潔方案:

FMLE: 
FMS URL: rtmp://demo.srs.com/livepkgr
Stream: livestream

Client:
RTMP: rtmp://demo.srs.com/livepkgr/livestream
HLS: http://demo.srs.com/livepkgr/livestream.m3u8
HDS: not support yet.      

既然談到了RTMP URL中的參數,下一章就說說這個。

RTMP URL參數

RTMP URL一般是不帶參數,類似于http的query,有時候為了特殊的要求,會在RTMP URL中帶參數,譬如:

  • Vhost:前面講過,在app後面加參數,可以通路指定伺服器的指定Vhost。這個SRS的特殊約定,友善排錯。
  • FMLE的Stream後面的參數,指定event之類的。SRS不需要這麼麻煩,HLS是内置支援,無需這種複雜的配置。Callback也是http的,FMS為了支援伺服器端腳本,需要很複雜的配置和複雜的參數,實在是很麻煩的設計。
  • token認證:SRS還未實作。在連接配接伺服器時,在app後面指定token(方式和vhost一樣),例如rtmp://server/live?vhost=xxx&token=xxx/livestream,伺服器可以取出token,進行驗證,若驗證失敗則斷開連接配接,這種是比Refer更進階的防盜鍊。

app和stream後面帶參數,這兩者有何差別,為何SRS把參數放在app後面?用戶端播放流的as3代碼大約是:

// how to play url: rtmp://demo.srs.com/live/livestream
conn = new NetConnection();
conn.connect("rtmp://demo.srs.com/live");

stream = new NetStream(conn);
stream.play("livestream");      

從RTMP協定的角度來看:

  • NetConnection.connect(vhost+app):這一步會完成握手,connect到vhost,切換到app。類似于登入到vhost後,cd到app這個目錄。也就是vhost的驗證,都可以在這一步做,也就是指定vhost也是在一步了,是以app後面跟的參數都是和vhost/app相關的。
  • NetStream.play(stream):這一步是播放指定的直播流。是以和stream相關的事件,都可以傳遞參數,譬如Adobe的event。SRS是沒有這些事件的,流啟動時,若配置了HLS會自動開始切片。

SRS的URL規則

SRS隻做簡化的事情,絕對不把簡單的事情搞複雜。

SRS的RTMP URL使用标準的RTMP URL,一般不需要對app和stream加參數,或者更改他們的意義。除了兩個地方:

  • vhost支援參數通路:為了友善運維通路某台伺服器的vhost,不需要設定hosts。不影響普通使用者。
  • 支援token驗證:為了支援token驗證,在app後面帶參數,這個是token驗證必須的方式。

另外,SRS建議使用者使用一級app和一級stream,不使用多級app和多級stream。譬如:

// 不推薦使用的多級app或stream
rtmp://demo.srs.com/show/live/livestream
rtmp://demo.srs.com/show/live/livestream/2013      

srs播放器(srs_player)和srs編碼器(srs_publisher)不支援多級app和stream,他們認為最後一個斜杠(/)後面的就是stream,前面的是app。即:

// srs_player和srs_publisher的解析方式:
// play or publish the following rtmp URL:
rtmp://demo.srs.com/show/live/livestream/2013
schema: rtmp
host/vhost: demo.srs.com
app: show/live/livestream
stream: 2013      

做此簡化的好處是,srs播放器和編碼器,隻需要指定一個url,而且兩者的url是一樣的。

SRS常見的三種RTMP URL,詳細見下表:

URL 說明
普通使用者的标準通路方式,觀看直播流
rtmp://192.168.1.10/live?vhost=demo.srs.com/livestream 運維對特定伺服器排錯
rtmp://demo.srs.com/live?key=ER892ID839KD9D0A1D87D/livestream token驗證使用者,或者帶寬測試的key驗證

SRS的Vhost

Category
defaultVhost 預設Vhost的配置,隻支援RTMP功能
chunksize.vhost.com 如何設定chunk size的執行個體。其他Vhost将此配置打開,即可設定chunk size。
Forward same.vhost.forward.vhost.com Forward執行個體:将流轉發到同一個vhost。
HLS with-hls.vhost.com HLS執行個體:如何開啟HLS,以及HLS的相關配置。
no-hls.vhost.com HLS執行個體:如何禁用HLS。
min.delay.com RTMP最低延遲:如何配置最低延遲的RTMP流
refer.anti_suck.com Refer執行個體:如何配置Refer防盜鍊。
bandcheck.srs.com 帶寬測試用的vhost,srs測速預設連接配接到這個vhost。這個vhost配置了帶寬測速的key,可測速間隔和最大測速帶寬限制。其他Vhost也可以支援測速,隻要把這個配置項打開,然後在測速播放器的參數中指明另外的vhost
removed.vhost.com 禁用vhost執行個體:如何禁用vhost。
Callback hooks.callback.vhost.com 設定http callback的執行個體,當這些事件發生時,SRS會調用指定的http api。其他Vhost将這些配置打開,就可以支援http callback。
Transcode mirror.transcode.vhost.com

轉碼執行個體:使用ffmpeg的執行個體filter,将視訊做鏡像翻轉處理。其他Vhost添加這個配置,就可以對流進行轉碼。

注:所有轉碼的流都需要重新推送到SRS,使用不同的流名稱(vhost和app也可以不一樣)。

crop.transcode.vhost.com 轉碼執行個體:剪裁視訊filter。其他vhost添加此filter,即可對視訊進行剪裁。
logo.transcode.vhost.com 轉碼執行個體:添加圖檔/視訊水印。其他vhost添加這些配置,可以加圖檔/視訊水印。
audio.transcode.vhost.com 轉碼執行個體:隻對音頻轉碼。其他vhost添加此配置,可隻對音頻轉碼。
copy.transcode.vhost.com 轉碼執行個體:隻轉封裝。類似于forward功能。
all.transcode.vhost.com 轉碼執行個體:對上面的執行個體的彙總。
ffempty.transcode.vhost.com 調用ffempty程式轉碼,這個隻是一個stub,列印出參數而已。用作調試用,看參數是否傳遞正确。
app.transcode.vhost.com 轉碼執行個體:隻對比對的app的流進行轉碼。
stream.transcode.vhost.com 轉碼執行個體:隻對比對的流進行轉碼。
DEMO srs_player播放的示範流,按照Readme的Step會推流到這個vhost,demo頁面打開後播放的流就是這個vhost中的流
players_pub srs編碼器推流到players這個vhost,然後轉碼後将流推送到這個vhost,并切片為hls,srs編碼器播放的帶字幕的流就是這個vhost的流
players_pub_rtmp srs編碼器示範頁面中的低延時播放器,播放的就是這個vhost的流,這個vhost關閉了gop cache,關閉了hls,讓延時最低(在1秒内)
srs的示範vhost,Readme的step最後的12路流示範,以及播放器的12路流延時,都是通路的這個vhost。包含了SRS所有的功能。
Others dev 開發用的,可忽略

繼續閱讀