SRS
SRS
一、简介
SRS是一个简单高效的实时视频服务器,支持RTMP、RTSP、WebRTC、HLS、HTTP-FLV、SRT、GB28181等协议。传统的监控端(Windows PC桌面)可以通过RTSP/GB28181推流到SRS服务器,Web浏览器可以通过WebRTC推流SRS服务器,然后通过RTMP、HTTP-FLV等方式观看视频。
SRS支持两种方式得到RTMP流源:
- 使用FFmpeg、设备或其它方式将流推送到SRS。
- 使用SRS自身采集功能,将文件(flv/mp4/mkv/avi/rmvb等)、流(RTMP/RTMPT/RTMPS/RTP/HTTP/HLS等)、音视频设备等数据转封装为RTMP流(如编码不是H.2645/aac,则需转码)然后推送到SRS。
应用场景:
- 虚拟直播:将文件编码为直播流,可指定多个文件,SRS会循环播放。
- RTSP摄像头对接,可以将RTSP采集后,以RTMP推送至SRS。
- 直接采集设备,SRS采集功能可以作为编码器采集设备上未压缩的图像数据,比如:video4Linux和alsa设备,编码为H.264/aac后将RTMP推送给SRS。
- 将HTTP流采集为RTMP,推送给SRS。
支持功能包括:
- RTMP推流,WebRTC播放、WebRTC推流。
- AAC转换成Opus,直播主要是AAC,而WebRTC是Opus。
- H5播放器rtc_player.html,已经放在了SRS网站上。
- 支持UDP端口复用,默认以UDP/8000端口传输数据。
- 支持通过ENV设置IP,在Docker中比较方便。
- 裁剪FFmpeg库,静态库链接。
- 使用FFmpeg-AAC编解码。
- 支持丢弃B帧,避免抖动,后续会支持高级丢帧。
二、编译
下载源码:
git clone https://github.com/ossrs/srs.git
编译:
cd ./srs/trunk ./configure --with-hls --with-ssl --with-http-server --with-http-callback --with-http-api --with-ingest --with-stream-caster make -j8
三、启动
./objs/srs -c ./conf/srs.conf
成功启动后,如下图所示:
使用FFmpeg推流:
ffmpeg -re -i ./box.mp4 -vcodec libx264 -f flv rtmp://192.168.1.2:1935/live/livestream
播放:
rtmp://192.168.1.2/live/livestream #RTMP地址 http://192.168.1.2:8080/live/livestream.flv #HTTP-FLV地址 http://192.168.1.2:8080/live/livestream.m3u8 #HLS流地址
四、集群
利用SRS的Forward机制和Edge Server 设计,可以很容易建立一个大规模高可用集群。
概念介绍:
- 源站服务器集群(Origin Server Cluster),借助Forward机制,仅用少量服务器,专门处理推流。
- 边缘服务器集群(Edge Server Cluster),可用N台机器,从源站拉流,用于较大规模的实时播放。
五、SRS启用webRTC播放
SRS4.0.14以上版本默认支持webRTC(-rtc=on),所以直接编译即可:
./configure --with-hls --with-ssl --with-http-server --with-http-callback --with-http-api --with-ingest --with-stream-caster
使用默认的RTC配置启动SRS
./objs/srs -c ./conf/rtc.conf
使用ffmpeg采集本地音视频,推流至SRS,SRS会通过协议转换生成WebRTC协议,将RTMP流至SRS中:
ffmpeg -f dshow -i video="HD Camera" -vcodec libx264 -x264opts "bframse=0" -r 25 -g 25 -preset:v ultrafast -tune:v zerolatency -f flv rtmp://192.168.1.2:1935/live/1
使用SRS自带的rtc_play播放器,之前请求SRS服务器的8080端口。
http://192.168.1.2:8080/players/rtc_player.html
在url 输入框中填入:
webrtc://192.168.1.2/live/1
点击播放视频按钮,即可播放直播流了。