RTMP的url其实很简单,vhost其实也没有什么新的概念,但是对于没有使用过的同学来讲,还是很容易混淆。几乎每个新人都必问的问题:RTMP那个URL推流时应该填什么,什么是vhost,什么是app?
RTMP和HLS的优势参考:HLS
Vhost的主要应用场景包括:
总之,vhost作为应用配置的单元,能隔离客户,应用不同的配置。
标准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 | 192.168.1.10 | 1935 | live | livestream |
其中:
其实,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
,所有在这个聊天室的人都是播放这个流。
RTMP的Vhost和HTTP的Vhost概念是一样的:虚拟主机。详见下表(假设域名demo.srs.com被解析到IP为192.168.1.10的服务器):
HTTP | Host | Port | Vhost |
---|---|---|---|
http://demo.srs.com:80/players/srs_player.html | 192.168.1.10 | 80 | demo.srs.com |
rtmp://demo.srs.com:1935/live/livestream | 192.168.1.10 | 1935 | demo.srs.com |
Vhost主要的作用是:
假设cctv和wasu都运行在一台边缘节点(192.168.1.10)上,用户访问这两个媒体的流时,Vhost的作用见下表:
RTMP | Host | Port | Vhost | App | Stream |
---|---|---|---|---|---|
rtmp://show.cctv.cn/live/livestream | 192.168.1.10 | 1935 | show.cctv.cn | live | livestream |
rtmp://show.wasu.cn/live/livestream | 192.168.1.10 | 1935 | show.wasu.cn | live | livestream |
在边缘节点(192.168.1.10)上的SRS,需要配置Vhost,例如:
listen 1935;
vhost show.cctv.cn {
}
vhost show.wasu.cn {
}
详细参考DNS和CDN的实现。
以上面举的例子,若cctv需要延迟最低(意味着启动时只有声音,画面是黑屏),而wasu需要快速启动(打开就能看到视频,服务器cache了最后一个gop,延迟会较大)。
只需要对这两个Vhost进行不同的配置,例如:
listen 1935;
vhost show.cctv.cn {
chunk_size 128;
}
vhost show.wasu.cn {
chunk_size 4906;
}
总之,这两个Vhost的配置完全没有关系,不会相互影响。
FMS的__defaultVhost__是默认的vhost,当用户请求的vhost没有匹配成功时,若配置了defaultVhost,则使用它来提供服务。若匹配失败,也没有defaultVhost,则返回错误。
譬如,服务器192.168.1.10上的SRS配置如下:
listen 1935;
vhost demo.srs.com {
enabled on;
}
那么,当用户访问以下vhost时:
defaultVhost和其他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 解析到指定边缘 |
运维 | rtmp://demo.srs.com/live/livestream | 192.168.1.100 demo.srs.com | 查看192.168.1.100上的流 |
运维 | rtmp://192.168.1.100/live? vhost=demo.srs.com/livestream |
无 | 查看192.168.1.100上的流 |
运维 | rtmp://192.168.1.100/live ...vhost...demo.srs.com/livestream |
无 | 查看192.168.1.100上的流 |
访问其他服务器的流也类似。
FMLE推流时,URL那个地方,有三个可以输入的框,参考Adobe FMLE:
实际上是将RTMP URL分成了两部分,stream前面那部分和stream。为何要这么搞?我猜想有以下原因:
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一般是不带参数,类似于http的query,有时候为了特殊的要求,会在RTMP URL中带参数,譬如:
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协议的角度来看:
SRS只做简化的事情,绝对不把简单的事情搞复杂。
SRS的RTMP URL使用标准的RTMP URL,一般不需要对app和stream加参数,或者更改他们的意义。除了两个地方:
另外,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://demo.srs.com/live/livestream | 普通用户的标准访问方式,观看直播流 |
rtmp://192.168.1.10/live?vhost=demo.srs.com/livestream | 运维对特定服务器排错 |
rtmp://demo.srs.com/live?key=ER892ID839KD9D0A1D87D/livestream | token验证用户,或者带宽测试的key验证 |
SRS的full.conf配置文件中,有很多Vhost,主要是为了说明各个功能,每个功能都单独列出一个vhost。所有功能都放在demo.srs.com这个vhost中。
Category | Vhost | 说明 |
---|---|---|
RTMP | defaultVhost | 默认Vhost的配置,只支持RTMP功能 |
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的相关配置。 |
HLS | no-hls.vhost.com | HLS实例:如何禁用HLS。 |
RTMP | min.delay.com | RTMP最低延迟:如何配置最低延迟的RTMP流 |
RTMP | refer.anti_suck.com | Refer实例:如何配置Refer防盗链。 |
RTMP | bandcheck.srs.com | 带宽测试用的vhost,srs测速默认连接到这个vhost。这个vhost配置了带宽测速的key,可测速间隔和最大测速带宽限制。其他Vhost也可以支持测速,只要把这个配置项打开,然后在测速播放器的参数中指明另外的vhost |
RTMP | 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也可以不一样)。 |
Transcode | crop.transcode.vhost.com | 转码实例:剪裁视频filter。其他vhost添加此filter,即可对视频进行剪裁。 注:所有转码的流都需要重新推送到SRS,使用不同的流名称(vhost和app也可以不一样)。 |
Transcode | logo.transcode.vhost.com | 转码实例:添加图片/视频水印。其他vhost添加这些配置,可以加图片/视频水印。 注:所有转码的流都需要重新推送到SRS,使用不同的流名称(vhost和app也可以不一样)。 |
Transcode | audio.transcode.vhost.com | 转码实例:只对音频转码。其他vhost添加此配置,可只对音频转码。 注:所有转码的流都需要重新推送到SRS,使用不同的流名称(vhost和app也可以不一样)。 |
Transcode | copy.transcode.vhost.com | 转码实例:只转封装。类似于forward功能。 |
Transcode | all.transcode.vhost.com | 转码实例:对上面的实例的汇总。 |
Transcode | ffempty.transcode.vhost.com | 调用ffempty程序转码,这个只是一个stub,打印出参数而已。用作调试用,看参数是否传递正确。 |
Transcode | app.transcode.vhost.com | 转码实例:只对匹配的app的流进行转码。 |
Transcode | stream.transcode.vhost.com | 转码实例:只对匹配的流进行转码。 |
SRS的demo.conf配置文件中,包含了demo用到的一些vhost,参考Usage: Demo。
Category | Vhost | 说明 |
---|---|---|
DEMO | players | srs_player播放的演示流,按照Readme的Step会推流到这个vhost,demo页面打开后播放的流就是这个vhost中的流 |
DEMO | players_pub | srs编码器推流到players这个vhost,然后转码后将流推送到这个vhost,并切片为hls,srs编码器播放的带字幕的流就是这个vhost的流 |
DEMO | players_pub_rtmp | srs编码器演示页面中的低延时播放器,播放的就是这个vhost的流,这个vhost关闭了gop cache,关闭了hls,让延时最低(在1秒内) |
DEMO | demo.srs.com | srs的演示vhost,Readme的step最后的12路流演示,以及播放器的12路流延时,都是访问的这个vhost。包含了SRS所有的功能。 |
Others | dev | 开发用的,可忽略 |
Winlin 2014.2