使用SRS(Simple Realtime Server)快速实现直播功能全指南
在直播技术领域,SRS(Simple Realtime Server)凭借其轻量、高性能、易部署的特性,成为很多开发者实现直播功能的首选方案。它支持RTMP、HLS、HTTP-FLV等主流直播协议,能轻松应对推流、转码、分发等核心直播场景。本文将从环境准备、服务搭建、推流拉流实战,到核心功能配置,带你一步步用SRS搭建起一套完整的直播系统。
一、SRS核心优势与适用场景
在开始实操前,先明确SRS的核心价值,方便大家判断是否契合自身需求:
轻量高效:核心代码简洁,资源占用低,单台服务器可支撑大量并发流,适合中小规模直播场景(如企业内训、垂直领域直播)。
协议全面:完美支持RTMP(推流首选)、HLS(移动端拉流适配)、HTTP-FLV(低延迟拉流),覆盖主流终端(PC、手机、智能设备)。
易部署易配置:提供丰富的默认配置模板,支持Docker快速部署,无需复杂的依赖环境搭建。
功能完备:支持转码、截图、录制、推拉流鉴权、CDN对接等直播核心需求,可扩展性强。
适用场景:企业直播、教育直播、游戏直播、监控直播、小型秀场直播等;不适合超大规模(百万级并发)的头部直播场景(此类场景建议结合CDN+分布式SRS集群)。
二、环境准备
2.1 服务器要求
系统:CentOS 7/8、Ubuntu 18.04+(推荐CentOS 7,兼容性更好)。
配置:最低2核4G(支撑100人以内并发拉流),推荐4核8G(支撑500人以内并发)。
网络:必须具备公网IP,带宽根据并发量计算(1路720P直播流约占2Mbps带宽,500人并发需1000Mbps=1G带宽)。
端口开放:需开放80(HLS/HTTP-FLV)、1935(RTMP推流+拉流)、8080(SRS控制台)端口(云服务器需在安全组配置放行)。
2.2 依赖工具安装
登录服务器,执行以下命令安装基础依赖(以CentOS 7为例):
yum update -y
yum install -y git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel
yum install -y ffmpeg # ffmpeg可用于推流、拉流、转码测试
三、SRS服务搭建(两种方式:Docker部署/源码编译,推荐Docker)
3.1 Docker部署(最简单,推荐新手)
Docker部署无需编译,直接拉取镜像启动即可,步骤如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl start docker # 启动Docker服务
systemctl enable docker # 设置Docker开机自启
docker pull ossrs/srs:4
mkdir -p /data/srs/conf
mkdir -p /data/srs/logs
mkdir -p /data/srs/record # 用于存储直播录制文件
docker run -d \
--name srs \
--net=host \
-v /data/srs/conf:/usr/local/srs/conf \
-v /data/srs/logs:/usr/local/srs/logs \
-v /data/srs/record:/usr/local/srs/objs/nginx/html/record \
ossrs/srs:4 ./objs/srs -c conf/srs.conf
验证启动是否成功:执行 docker ps,若能看到名称为srs的容器处于Up状态,则启动成功。
3.2 源码编译部署(适合需要自定义功能的场景)
若需要修改SRS源码或定制化配置,可采用源码编译方式:
git clone -b 4.0release https://gitee.com/ossrs/srs.git /data/srs
cd /data/srs/trunk
./configure --prefix=/usr/local/srs # 指定安装目录
make && make install # 编译并安装
cd /usr/local/srs
./objs/srs -c conf/srs.conf # 使用默认配置启动
echo "/usr/local/srs/objs/srs -c /usr/local/srs/conf/srs.conf" >> /etc/rc.local
chmod +x /etc/rc.local
验证启动:执行 ps -ef | grep srs,若能看到srs进程,则启动成功。
3.3 访问SRS控制台
SRS默认自带控制台,用于查看流状态、服务器信息等。打开浏览器,访问:http://服务器公网IP:8080,若能看到SRS控制台页面,则说明服务部署正常。
四、推流与拉流实战(核心步骤)
直播的核心流程是:推流端(如摄像头、OBS)→ SRS服务器 → 拉流端(如浏览器、播放器)。下面以“OBS推流+浏览器拉流”为例,完成完整直播流程。
4.1 基础配置(默认配置即可支撑基础推流拉流)
SRS默认配置文件(conf/srs.conf)已开启RTMP和HLS协议支持,无需修改即可使用,核心配置片段如下(可参考了解):
listen 1935;
hls {
enabled on;
hls_path ./objs/nginx/html; # HLS文件存储路径(映射到本地/data/srs/record)
hls_fragment 10; # 切片时长(秒)
hls_window 60; # 窗口大小(保留最近60秒切片)
}
http_flv {
enabled on;
listen 8080; # HTTP-FLV监听端口
}
http_server {
enabled on;
listen 8080; # 控制台端口(与HTTP-FLV共用)
dir ./objs/nginx/html;
}
4.2 OBS推流设置(PC端推流工具)
OBS是免费开源的推流工具,支持Windows/Mac/Linux,下载地址:https://obsproject.com/。安装完成后,配置推流参数:
打开OBS,点击“文件”→“设置”→“推流”。
推流类型选择“自定义”,URL填写:rtmp://服务器公网IP/live(live是SRS默认的应用名,可在配置文件中修改)。
串流密钥(Stream Key)填写自定义的流名称,例如test123(后续拉流需用到此名称,格式为live/test123)。
点击“确定”,回到主界面,添加推流源(如“显示器捕获”“窗口捕获”“视频捕获设备”等)。
点击右下角“开始推流”,若OBS状态栏显示“推流中”且无错误,则推流成功。
4.3 拉流验证(多终端测试)
推流成功后,可通过多种终端和协议拉流,验证直播效果:
4.3.1 浏览器拉流(HLS协议,适配移动端)
HLS协议的拉流地址格式:http://服务器公网IP:8080/live/test123.m3u8(test123为之前设置的串流密钥)。
直接在浏览器(Chrome、Safari、微信内置浏览器等)中输入该地址,即可播放直播(HLS协议有10-30秒延迟,适合移动端场景)。
4.3.2 播放器拉流(RTMP协议,低延迟)
使用支持RTMP的播放器(如VLC、PotPlayer),打开拉流地址:rtmp://服务器公网IP/live/test123,即可播放(RTMP延迟约1-3秒,适合PC端低延迟场景)。
4.3.3 浏览器拉流(HTTP-FLV协议,超低延迟)
HTTP-FLV协议延迟更低(约0.5-2秒),需使用支持FLV的浏览器播放器(如Video.js+flv.js)。示例代码如下(保存为html文件,用浏览器打开):
<!DOCTYPE html>
<html>
<head>
<title>SRS HTTP-FLV 直播</title>
<script src="https://cdn.bootcdn.net/ajax/libs/flv.js/1.6.2/flv.min.js"></script>
</head>
<body>
<video id="livePlayer" width="1280" height="720" controls autoplay></video>
<script>
if (flvjs.isSupported()) {
var videoElement = document.getElementById('livePlayer');
var flvPlayer = flvjs.createPlayer({
type: 'flv',
url: 'http://服务器公网IP:8080/live/test123.flv' // HTTP-FLV拉流地址
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
}
</script>
</body>
</html>
五、SRS核心功能配置(进阶)
基础直播流程跑通后,可根据实际需求配置进阶功能,以下是常用功能的配置方法:
5.1 直播录制(保存直播视频)
SRS支持将直播流录制为FLV或MP4文件,配置方法:修改SRS配置文件(/data/srs/conf/srs.conf),添加录制配置:
rtmp {
listen 1935;
max_connections 1000; # 最大连接数
vhost __defaultVhost__ {
record {
enabled on; # 开启录制
record_format flv; # 录制格式(flv/mp4,推荐flv,兼容性更好)
record_path ./objs/nginx/html/record; # 录制文件存储路径
record_duration 3600; # 单个文件录制时长(秒,1小时)
record_prefix [stream]-[timestamp]; # 文件名前缀(流名称-时间戳)
}
}
}
配置完成后,重启SRS服务:docker restart srs(Docker部署)或/usr/local/srs/objs/srs -c /usr/local/srs/conf/srs.conf restart(源码部署)。后续推流时,SRS会自动录制文件,可通过http://服务器公网IP:8080/record/文件名.flv访问录制文件。
5.2 推流鉴权(防止恶意推流)
为避免他人盗用服务器资源推流,需配置推流鉴权。SRS支持基于密钥的鉴权方式,配置步骤:
rtmp {
listen 1935;
vhost __defaultVhost__ {
auth {
enabled on;
play off; # 拉流是否鉴权(off关闭,on开启)
publish on; # 推流鉴权开启
publish_key mysecretkey; # 鉴权密钥(自定义,需保密)
publish_url /live/([^/]+); # 匹配推流路径(live/流名称)
}
}
}
推流时,需在推流URL中添加鉴权参数(timestamp+md5签名),格式:
rtmp://服务器IP/live/流名称?sign=md5(流名称+timestamp+密钥)×tamp=当前时间戳
其中,timestamp为当前Unix时间戳(秒),sign为MD5加密后的字符串(流名称、timestamp、密钥拼接后的字符串)。
示例(流名称test123,密钥mysecretkey,timestamp=1699999999):
拼接字符串:test1231699999999mysecretkey
MD5签名(可通过在线MD5工具计算):abcdef1234567890
最终推流URL:rtmp://服务器IP/live/test123?sign=abcdef1234567890×tamp=1699999999
在OBS中修改推流URL为上述带鉴权的地址,即可完成鉴权推流。
5.3 转码(适配不同终端分辨率)
若推流端是高清流(如1080P),需适配移动端低带宽场景,可配置SRS转码功能,生成多种分辨率的流(如720P、480P)。配置方法:
rtmp {
listen 1935;
vhost __defaultVhost__ {
transcode {
enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg; # SRS内置ffmpeg路径
engine ff {
enabled on;
vfilter {
scale=1280:720,setdar=16:9;
}
vcodec libx264;
vbitrate 1500;
vfps 25;
acodec aac;
abitrate 128;
asample_rate 44100;
output rtmp://127.0.0.1/live/[stream]_720p; # 转码后流名称(原流名称_720p)
}
engine ff2 {
enabled on;
vfilter {
# 转码为480P,码率800kbps
scale=854:480,setdar=16:9;
}
vcodec libx264;
vbitrate 800;
vfps 25;
acodec aac;
abitrate 64;
asample_rate 44100;
output rtmp://127.0.0.1/live/[stream]_480p;
}
}
}
}
配置完成后重启SRS,推流test123后,会自动生成test123_720p和test123_480p两个转码流,拉流时使用对应流名称即可(如http://服务器IP:8080/live/test123_480p.m3u8)。
六、常见问题排查
6.1 推流失败(OBS提示“连接失败”)
检查服务器1935端口是否开放(云服务器安全组+防火墙):执行firewall-cmd --query-port=1935/tcp,若返回no,需执行firewall-cmd --add-port=1935/tcp --permanent && firewall-cmd --reload开放端口。
检查SRS服务是否正常运行:docker logs srs(Docker部署)查看日志,若有错误信息(如端口被占用),需排查端口占用问题。
检查推流URL格式是否正确:确保是rtmp://服务器公网IP/live/流名称,避免写成内网IP。
6.2 拉流失败(浏览器/播放器无法播放)
检查推流是否正常:在SRS控制台(http://服务器IP:8080)的“流管理”中,查看是否有对应的流(如live/test123),若没有则推流失败。
检查拉流端口是否开放(8080端口):执行firewall-cmd --query-port=8080/tcp,未开放则按上述方法开放。
检查拉流地址是否正确:流名称是否与推流时的串流密钥一致,协议是否匹配(如HLS地址需加.m3u8后缀)。
6.3 直播延迟过高
HLS协议本身延迟较高(10-30秒),若需低延迟,建议使用RTMP或HTTP-FLV协议。
调整HLS切片时长:在srs.conf中修改hls_fragment 5(最小5秒),可降低部分延迟。
检查网络状况:服务器带宽不足或网络波动会导致延迟升高,需升级带宽或优化网络。
七、总结
通过本文的步骤,你已成功用SRS搭建起一套基础的直播系统,实现了推流、拉流、录制、鉴权、转码等核心功能。SRS的优势在于简单易用、轻量化,适合快速落地中小规模直播场景。若需要支撑更大并发,可结合CDN进行分发,或部署SRS集群(官方提供集群部署方案)。
后续可进一步探索SRS的高级功能,如截图、水印、API对接(通过HTTP API获取流状态、控制推流拉流)、对接第三方直播平台等。如果在实操过程中有问题,可参考SRS官方文档(https://ossrs.net/lts/zh-cn/docs/)或在官方社区提问。
我做了一个网站,支持使用srs进行webrtc直播,欢迎体验:https://live.codeemo.cn/
求网站源码测试
注册就能测试