SRS(Simple Rtmp Server)是MIT协议的开源流媒体服务器项目。

下载源码,推荐用CentOS7系统:

git clone -b 3.0release https://gitee.com/ossrs/srs.git

编译,注意需要切换到srs/trunk目录:

cd srs/trunk
./configure
make

启动服务器:

./objs/srs -c conf/realtime.conf

检查SRS是否成功启动,可以打开 http://localhost:8080/ ,或者执行命令:

# 查看SRS的状态
./etc/init.d/srs status
# 或者看SRS的日志
tail -f ./objs/srs.log

使用OBS串流:

服务器: rtmp://localhost/live
串流密钥: livestream




RTMP低延时配置

配置SRS为Realtime模式,使用RTMP可以将延迟降低到0.8-3秒,可以应用到对实时性要求不苛刻的地方,譬如视频会议(其实视频会议,以及人类在开会的时候,正常时候是会有人讲,有人在听在想,然后换别人讲,其实1秒左右延迟没有问题的,除非要吵架,就需要0.3秒左右的延迟)。

配置最低延迟的服务器详细信息可以参考:LowLatency,本文举例说明部署的实例步骤。

假设服务器的IP是:192.168.1.170

第一步,获取SRS。详细参考GIT获取代码

git clone https://github.com/ossrs/srs
cd srs/trunk

或者使用git更新已有代码:

git pull

第二步,编译SRS。详细参考Build

./configure && make

第三步,编写SRS配置文件。详细参考LowLatency

将以下内容保存为文件,譬如conf/realtime.conf,服务器启动时指定该配置文件(srs的conf文件夹有该文件)。

# conf/realtime.conf
listen              1935;
max_connections     1000;
vhost __defaultVhost__ {
    tcp_nodelay     on;
    min_latency     on;

    play {
        gop_cache       off;
        queue_length    10;
        mw_latency      100;
    }

    publish {
        mr off;
    }
}

第四步,启动SRS。详细参考LowLatency

./objs/srs -c conf/realtime.conf

第五步,启动推流编码器。详细参考LowLatency

使用FFMPEG命令推流:

    for((;;)); do \
        ./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \
        -vcodec copy -acodec copy \
        -f flv -y rtmp://192.168.1.170/live/livestream; \
        sleep 1; \
    done

或使用FMLE推流:

FMS URL: rtmp://192.168.1.170/live
Stream: livestream

备注:测量延迟,可以使用FMLE推流时,将智能手机的秒表功能打开,用FMLE摄像头对着秒表,然后对比FMLE的摄像头的图像,和服务器分发的头像的延迟,就知道精确的延迟多大。参考:延迟的测量

第六步,观看RTMP流。详细参考LowLatency

RTMP流地址为:rtmp://192.168.1.170/live/livestream

注意:不要使用VLC观看,VLC的延迟会很大,虽然VLC能看到流。

或者使用在线SRS播放器播放:http://ossrs.net/srs.release/trunk/research/players/srs_player.html?vhost=defaultVhost&autostart=true&server=192.168.1.170&app=live&stream=livestream

备注:请将所有实例的IP地址192.168.1.170都换成部署的服务器IP地址。




分发方式比较

互联网上的两种主要的分发方式:HLSRTMP,什么时候用谁,完全决定于应用场景。

还有其他的分发方式,这些分发方式不属于互联网常见和通用的方式,不予以比较:

  • UDP:譬如YY的实时应用,视频会议等等,或者RTSP之类。这类应用的特点就是实时性要求特别高,以毫秒计算。TCP家族协议根本就满足不了要求,所以HTTP/TCP都不靠谱。这类应用没有通用的方案,必须自己实现分发(服务端)和播放(客户端)。
  • P2P:譬如RTMFP或者各家自己的协议。这类应用的特点是节省带宽。目前PC/flash上的RTMFP比较成熟,Android上的P2P属于起步群雄纷争标准不一,IOS上P2P应该没有听说过。
  • RTSP:这种不是互联网上的主要应用,在其他领域譬如安防等有广泛应用。

另外,HTTP的也分为几种:

  • HTTP progressive:早期流媒体服务器分发http文件时,以普通的http文件分发,这种叫做渐进式下载,意思就是如果文件很大譬如1小时时长1GB大小,想从中间开始播放是不行的。但这种方式已经是作古了,很多http服务器支持http文件的seek,就是从中间开始播放。
  • HTTP stream:支持seek的HTTP流,譬如各家视频网站的点播分发方式。或者稍微复杂点的,譬如把一个大文件切几段之后分发。目前在pc/flash上点播国内的主流分发是这种方式。
  • HLS:这种是现在适配方式最广(除了flash, 需要额外的as库支持),在PC上有vlc,Android/IOS原生播放器就支持播放HLS,HTML5里面的url可以写HLS地址。总之,在移动端是以HLS为主。
  • HDS:adobe自己的HLS,一坨屎。
  • DASH:各家提出的HLS,目前还没有广泛应用。

对比以下互联网上用的流媒体分发方式:

  • HLS:apple的HLS,支持点播和直播。
  • HTTP:即HTTP stream,各家自己定义的http流,应用于国内点播视频网站。
  • RTMP:直播应用,对实时性有一定要求,以PC为主。

RTMP

RTMP本质上是流协议,主要的优势是:

  • 实时性高:RTMP的实时性在3秒之内,经过多层CDN节点分发后,实时性也在3秒左右。在一些实时性有要求的应用中以RTMP为主。
  • 支持加密:RTMPE和RTMPS为加密协议。虽然HLS也有加密,但在PC平台上flash对RTMPE/RTMPS支持应该比较不错。
  • 稳定性高:在PC平台上flash播放的最稳定方式是RTMP,如果做CDN或者大中型集群分发,选择稳定性高的协议一定是必要的。HTTP也很稳定,但HTTP是在协议上稳定;稳定性不只是服务端的事情,在集群分发,服务器管理,主备切换,客户端的支持上,RTMP在PC分发这种方式上还是很有优势。
  • 编码器接入:编码器输出到互联网(还可以输出为udp组播之类广电应用),主要是RTMP。譬如专业编码器,或者flash网页编码器,或者FMLE,或者ffmpeg,或者安防摄像头,都支持RTMP输出。若需要接入多种设备,譬如提供云服务;或者希望网页直接采集摄像头;或者能在不同编码器之间切换,那么RTMP作为服务器的输入协议会是最好的选择。
  • 系统容错:容错有很多种级别,RTMP的集群实现时可以指定N上层,在错误时切换不会影响到下层或者客户端,另外RTMP的流没有标识,切到其他的服务器的流也可以继续播放。HLS的流热备切换没有这么容易。若对于直播的容错要求高,譬如降低出问题的概率,选择RTMP会是很好的选择。
  • 可监控:在监控系统或者运维系统的角度看,流协议应该比较合适监控。HTTP的流监控感觉没有那么完善。这个不算绝对优势,但比较有利。

RTMP的劣势是:

  • 协议复杂:RTMP协议比起HTTP复杂很多,导致性能低下。测试发现两台服务器直连100Gbps网络中,HTTP能跑到60Gbps,但是RTMP只能跑到10Gbps,CPU占用率RTMP要高很多。复杂协议导致在研发,扩展,维护软件系统时都没有HTTP那么方便,所以HTTP服务器现在大行其道,apache/nginx/tomcat,N多HTTP服务器;而RTMP协议虽然早就公开,但是真正在大规模中分发表现良好的没有,adobe自己的FMS在CDN中都经常出问题。
  • Cache麻烦:流协议做缓存不方便。譬如点播,若做RTMP流协议,边缘缓存RTMP会很麻烦。如果是HTTP,缓存其实也很麻烦,但是HTTP服务器的缓存已经做了很久,所以只需要使用就好。这是为何点播都走HTTP的原因。

HTTP

HTTP说的是HTTP流,譬如各大视频网站的点播流。

HTTP本质上还是文件分发,主要的优势是:

  • 性能很高:HTTP的性能没得说,协议简单,各种HTTP高性能服务器也完善。如果分发的量特别大,譬如点播视频网站,没有直播的实时性要求,HTTP协议是最好选择。
  • 没有碎片:HTTP比HLS没有碎片,HTTP分发大文件会比小文件分发方便很多。特别是存储,小文件的性能超低,是个硬伤。
  • 穿墙:互联网不可能不开放HTTP协议,否则就不叫互联网。所以任何端口封掉,也不会导致HTTP流看不了。(不过RTMP也能穿墙,用RTMPT协议)。

HTTP的劣势是:

  • 实时性差:基本上没有实时性这个说法。
  • 原生支持不好:就PC上flash对于HTTP流支持还可以,Android/IOS上似乎只能mp4,总之移动端对于HTTP的支持不是很完善。

HLS

HLS是Apple的开放标准,在Android3?以上也原生支持.

HLS的主要优势是:

  • 性能高:和HTTP一样。
  • 穿墙:和HTTP一样。
  • 原生支持很好:IOS上支持完美。Android上支持差些。PC/flash上现在也有各种as插件支持HLS。

HLS的主要劣势是:

  • 实时性差:基本上HLS的延迟在10秒以上。
  • 文件碎片:若分发HLS,码流低,切片较小时,小文件分发不是很友好。特别是一些对存储比较敏感的情况,譬如源站的存储,嵌入式的SD卡。

应用方式

参考HTTPRTMP

推荐的方式是:

  • 编码器输出RTMP协议。
  • 流媒体系统接入使用RTMP协议。
  • 流媒体系统内部直播分发使用RTMP。
  • PC+直播+实时性要求高:使用flash播放RTMP。
  • PC+直播+没有实时性要求:使用RTMP或者HLS均可。
  • PC+点播:使用HTTP或者HLS。
  • Apple IOS/OSX:都使用HLS(实时性要求高得自己解析RTMP,或者使用外部库,譬如https://www.vitamio.org
  • Andorid:和IOS一样,不过可以确定的是可以自己开发支持RTMP。




HLS部署实例

SRS支持HLS的详细步骤。

假设服务器的IP是:192.168.1.170

第一步,获取SRS。详细参考GIT获取代码

git clone https://github.com/ossrs/srs
cd srs/trunk

或者使用git更新已有代码:

git pull

第二步,编译SRS。详细参考Build

./configure && make

第三步,编写SRS配置文件。详细参考HLS分发

将以下内容保存为文件,譬如conf/hls.conf,服务器启动时指定该配置文件(srs的conf文件夹有该文件)。

# conf/hls.conf
listen              1935;
max_connections     1000;
http_server {
    enabled         on;
    listen          8080;
    dir             ./objs/nginx/html;
}
vhost __defaultVhost__ {
    hls {
        enabled         on;
        hls_path        ./objs/nginx/html;
        hls_fragment    10;
        hls_window      60;
    }
}

备注:我们使用SRS内置的HTTP服务器分发HLS切片,也可以使用Nginx等Web服务器分发。

备注:hls_path必须存在,srs只会自动创建${hls_path}下的app的目录。参考:HLS分发: HLS流程

第四步,启动SRS。详细参考HLS分发

./objs/srs -c conf/hls.conf

第五步,用FFMPEG或FMLE推流。详细参考HLS分发

使用FFMPEG命令推流:

    for((;;)); do \
        ./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \
        -vcodec copy -acodec copy \
        -f flv -y rtmp://192.168.1.170/live/livestream; \
        sleep 1; \
    done

或使用支持h.264+aac的FMLE推流(若不支持h.264+aac,则可以使用srs转码,参考Transcode2HLS):

FMS URL: rtmp://192.168.1.170/live
Stream: livestream

生成的流地址为:

  • RTMP流地址为:rtmp://192.168.1.170/live/livestream
  • HLS流地址为: http://192.168.1.170:8080/live/livestream.m3u8

第六步,观看RTMP流。详细参考HLS分发

RTMP流地址为:rtmp://192.168.1.170/live/livestream

可以使用VLC观看。

或者使用在线SRS播放器播放:srs-player

备注:请将所有实例的IP地址192.168.1.170都换成部署的服务器IP地址。

第七步,观看HLS流。详细参考HLS分发

HLS流地址为: http://192.168.1.170:8080/live/livestream.m3u8

可以使用VLC观看。

或者使用在线SRS播放器播放:srs-player

备注:请将所有实例的IP地址192.168.1.170都换成部署的服务器IP地址。

注意:VLC无法观看纯音频流,jwplayer可以观看。

分发纯音频流参考:HLS audio only

Q&A

RTMP流能看,HLS看不了

  • 确认nginx启动并且可以访问:nginx is ok页面能访问。
  • 确认m3u8文件能下载:浏览器打开http://192.168.1.170:8080/live/livestream.m3u8,ip地址换成你服务器的IP地址。
  • 若m3u8能下载,可能是srs-player的问题,使用vlc播放地址:http://192.168.1.170:8080/live/livestream.m3u8,ip地址换成你服务器的IP地址。
  • 若VLC不能播放,将m3u8下载后,用文本编辑器打开,将m3u8文件内容发到群中,或者贴到issue中。寻求帮助。
  • 还有可能是编码问题,参考下面的“RTMP流和HLS流内容不一致”

RTMP流内容和HLS流内容不一致

  • 一般这种问题出现在使用上面的例子推流,然后换成别的编码器推流,或者换个文件推流。
  • 可能是流的编码不对(推流时使用FMLE),HLS需要h.264+aac,需要转码,参考只转码音频Transcode2HLS




SRS-HTTP服务部署实例

SRS内嵌了http服务器,支持分发hls流和文件。

以分发HLS为例,使用SRS分发RTMP和HLS流,不依赖于外部服务器。

假设服务器的IP是:192.168.1.170

第一步,获取SRS。详细参考GIT获取代码

git clone https://github.com/ossrs/srs
cd srs/trunk

或者使用git更新已有代码:

git pull

第二步,编译SRS。详细参考[Build]Build]

./configure && make

第三步,编写SRS配置文件。详细参考[HLS分发]HLS]和HTTP服务器

将以下内容保存为文件,譬如conf/http.hls.conf,服务器启动时指定该配置文件(srs的conf文件夹有该文件)。

# conf/http.hls.conf
listen              1935;
max_connections     1000;
http_server {
    enabled         on;
    listen          8080;
    dir             ./objs/nginx/html;
}
vhost __defaultVhost__ {
    hls {
        enabled         on;
        hls_path        ./objs/nginx/html;
        hls_fragment    10;
        hls_window      60;
    }
}

备注:hls_path必须存在,srs只会自动创建${hls_path}下的app的目录。参考:HLS分发: HLS流程

第四步,启动SRS。详细参考HLS分发HTTP服务器

./objs/srs -c conf/http.hls.conf

备注:请确定srs-http-server已经启动,可以访问nginx,若能看到nginx is ok则没有问题。

备注:实际上提供服务的是SRS,可以看到响应头是Server: SRS/0.9.51之类。

第五步,启动推流编码器。详细参考HLS分发

使用FFMPEG命令推流:

    for((;;)); do \
        ./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \
        -vcodec copy -acodec copy \
        -f flv -y rtmp://192.168.1.170/live/livestream; \
        sleep 1; \
    done

或使用支持h.264+aac的FMLE推流(若不支持h.264+aac,则可以使用srs转码,参考Transcode2HLS):

FMS URL: rtmp://192.168.1.170/live
Stream: livestream

生成的流地址为:

  • RTMP流地址为:rtmp://192.168.1.170/live/livestream
  • HLS流地址为: http://192.168.1.170:8080/live/livestream.m3u8

第六步,观看RTMP流。详细参考HLS分发

RTMP流地址为:rtmp://192.168.1.170/live/livestream

可以使用VLC观看。

或者使用在线SRS播放器播放:srs-player

备注:请将所有实例的IP地址192.168.1.170都换成部署的服务器IP地址。

第七步,观看HLS流。详细参考HLS分发

HLS流地址为: http://192.168.1.170:8080/live/livestream.m3u8

可以使用VLC观看。

或者使用在线SRS播放器播放:srs-player

备注:请将所有实例的IP地址192.168.1.170都换成部署的服务器IP地址。

注意:VLC无法观看纯音频流,jwplayer可以观看。

分发纯音频流参考:HLS audio only

Q&A

RTMP流能看,HLS看不了

  • 确认srs-http-server启动并且可以访问:nginx is ok页面能访问。
  • 确认m3u8文件能下载:浏览器打开http://192.168.1.170:8080/live/livestream.m3u8,ip地址换成你服务器的IP地址。
  • 若m3u8能下载,可能是srs-player的问题,使用vlc播放地址:http://192.168.1.170:8080/live/livestream.m3u8,ip地址换成你服务器的IP地址。
  • 若VLC不能播放,将m3u8下载后,用文本编辑器打开,将m3u8文件内容发到群中,或者贴到issue中。寻求帮助。
  • 还有可能是编码问题,参考下面的“RTMP流和HLS流内容不一致”

RTMP流内容和HLS流内容不一致

  • 一般这种问题出现在使用上面的例子推流,然后换成别的编码器推流,或者换个文件推流。
  • 可能是流的编码不对(推流时使用FMLE),HLS需要h.264+aac,需要转码,参考只转码音频Transcode2HLS或者全转码[HLS+Transcode][HLS-And-Transcode]




SRS-HTTP-FLV集群部署实例

SRS支持HTTP FLV直播流集群分发,详细参考HTTP FLV

SRS的HTTP FLV边缘只能使用单进程,如何做到多进程呢?可以使用HTTP反向代理,SRS提供了go-sharp,支持根据SRS边缘的负载均衡以及心跳检测。参考:go-sharp

本例子部署了三个SRS,侦听不同的端口(实际可以部署到不同的机器,侦听同一个端口),一个作为Origin源站,两个作为Edge边缘。推RTMP流到源站或者边缘后,可以通过任何Edge观看,和RTMP的效果一样,集群的延迟在0.8-3秒。

假设服务器的IP是:192.168.1.170

第一步,获取SRS。详细参考GIT获取代码

git clone https://github.com/ossrs/srs
cd srs/trunk

或者使用git更新已有代码:

git pull

第二步,编译SRS。详细参考Build

./configure && make

第三步,编写SRS源站配置文件。详细参考HTTP FLV

将以下内容保存为文件,譬如conf/http.flv.live.conf,服务器启动时指定该配置文件(srs的conf文件夹有该文件)。

# conf/http.flv.live.conf
listen              1935;
max_connections     1000;
http_server {
    enabled         on;
    listen          8080;
    dir             ./objs/nginx/html;
}
vhost __defaultVhost__ {
    http_remux {
        enabled     on;
        mount       [vhost]/[app]/[stream].flv;
        hstrs       on;
    }
}

第四步,编写SRS边缘配置文件。详细参考HTTP FLV

将以下内容保存为文件,譬如conf/http.flv.live.edge1.confconf/http.flv.live.edge2.conf,服务器启动时指定该配置文件(srs的conf文件夹有该文件)。

# conf/http.flv.live.edge1.conf
listen              19351;
max_connections     1000;
pid                 objs/srs.flv.19351.pid;
srs_log_file        objs/srs.flv.19351.log;
http_server {
    enabled         on;
    listen          8081;
    dir             ./objs/nginx/html;
}
vhost __defaultVhost__ {
    mode remote;
    origin 127.0.0.1;
    http_remux {
        enabled     on;
        mount       [vhost]/[app]/[stream].flv;
        hstrs       on;
    }
}

第五步,启动SRS。详细参考HTTP FLV

./objs/srs -c conf/http.flv.live.conf &
./objs/srs -c conf/http.flv.live.edge1.conf &
./objs/srs -c conf/http.flv.live.edge2.conf &

第六步,启动推流编码器。详细参考HTTP FLV

使用FFMPEG命令推流:

    for((;;)); do \
        ./objs/ffmpeg/bin/ffmpeg -re -i ./doc/source.200kbps.768x320.flv \
        -vcodec copy -acodec copy \
        -f flv -y rtmp://192.168.1.170/live/livestream; \
        sleep 1; \
    done

或使用支持FMLE推流:

FMS URL: rtmp://192.168.1.170/live
Stream: livestream

源站,生成的流地址为:

  • RTMP流地址为:rtmp://192.168.1.170/live/livestream
  • HTTP FLV: http://192.168.1.170:8080/live/livestream.flv

边缘1,生成的流地址为:

  • RTMP流地址为:rtmp://192.168.1.170:19351/live/livestream
  • HTTP FLV: http://192.168.1.170:8081/live/livestream.flv

边缘2,生成的流地址为:

  • RTMP流地址为:rtmp://192.168.1.170:19352/live/livestream
  • HTTP FLV: http://192.168.1.170:8082/live/livestream.flv

第七步,观看RTMP流。详细参考HTTP FLV

源站RTMP流地址为:rtmp://192.168.1.170/live/livestream,可以使用VLC观看,或者使用在线SRS播放器播放:srs-player

边缘1的RTMP流地址为:rtmp://192.168.1.170:19351/live/livestream,可以使用VLC观看,或者使用在线SRS播放器播放:srs-player-19351

边缘2的RTMP流地址为:rtmp://192.168.1.170:19352/live/livestream,可以使用VLC观看,或者使用在线SRS播放器播放:srs-player-19352

备注:请将所有实例的IP地址192.168.1.170都换成部署的服务器IP地址。

第八步,观看HTTP流。详细参考HTTP FLV

源站HTTP FLV流地址为: http://192.168.1.170:8080/live/livestream.flv,可以使用VLC观看,或者使用在线SRS播放器播放:jwplayer-flv

边缘1的HTTP FLV流地址为: http://192.168.1.170:8081/live/livestream.flv,可以使用VLC观看,或者使用在线SRS播放器播放:jwplayer-flv-8081

边缘2的HTTP FLV流地址为: http://192.168.1.170:8082/live/livestream.flv,可以使用VLC观看,或者使用在线SRS播放器播放:jwplayer-flv-8081

备注:请将所有实例的IP地址192.168.1.170都换成部署的服务器IP地址。



在WordPress中在线播放SRS串流视频

搜索插件SRS Player

或:点击下载

For HLS live streaming, please use the following shortcode:

[srs_player url="https://your_server/live/livestream.m3u8"]

For WebRTC streaming, the shortcode:

[srs_player url="webrtc://your_server/live/livestream"]

For HTTP-FLV live streaming, the shortcode:

[srs_player url="https://your_server/live/livestream.flv"]

For HLS/MP4 VoD streaming, the shortcode:

[srs_player url="https://your_server/vod/file.mp4"]

You could also use WebRTC to publish live stream:

[srs_publisher url="webrtc://your_server/live/livestream"]

For detailed documentation, please visit the SRS Player page.

示例

[srs_player url="http://ipv4.sfwww.cn:8080/live/livestream.m3u8"]

最后修改:2024 年 08 月 21 日
如果我的文章对你有用,请帮助小站能够存活下去( •̀ ω •́ )✧