使用SRS(Simple Realtime Server)快速实现直播功能全指南

卷心菜

使用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

安装编译依赖(SRS源码编译需用到)

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部署无需编译,直接拉取镜像启动即可,步骤如下:

1. 安装Docker(若未安装)

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
systemctl start docker # 启动Docker服务
systemctl enable docker # 设置Docker开机自启

2. 拉取SRS官方镜像(最新稳定版,当前为4.0+)

docker pull ossrs/srs:4

3. 启动SRS容器(映射端口+挂载配置文件目录,方便后续修改配置)

先创建本地配置目录(用于挂载容器内的SRS配置)

mkdir -p /data/srs/conf
mkdir -p /data/srs/logs
mkdir -p /data/srs/record # 用于存储直播录制文件

启动容器(--net=host表示使用主机网络,避免端口映射问题)

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源码或定制化配置,可采用源码编译方式:

1. 克隆SRS源码(官方仓库)

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

2. 进入源码目录,编译SRS

cd /data/srs/trunk
./configure --prefix=/usr/local/srs # 指定安装目录
make && make install # 编译并安装

3. 启动SRS服务

cd /usr/local/srs
./objs/srs -c conf/srs.conf # 使用默认配置启动

4. 设置SRS开机自启(可选)

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协议支持,无需修改即可使用,核心配置片段如下(可参考了解):

监听RTMP端口(默认1935)

listen 1935;

开启HLS(用于移动端拉流)

hls {
enabled on;
hls_path ./objs/nginx/html; # HLS文件存储路径(映射到本地/data/srs/record)
hls_fragment 10; # 切片时长(秒)
hls_window 60; # 窗口大小(保留最近60秒切片)
}

开启HTTP-FLV(低延迟拉流,可选)

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/。安装完成后,配置推流参数

  1. 打开OBS,点击“文件”→“设置”→“推流”。

  2. 推流类型选择“自定义”,URL填写:rtmp://服务器公网IP/live(live是SRS默认的应用名,可在配置文件中修改)。

  3. 串流密钥(Stream Key)填写自定义的流名称,例如test123(后续拉流需用到此名称,格式为live/test123)。

  4. 点击“确定”,回到主界面,添加推流源(如“显示器捕获”“窗口捕获”“视频捕获设备”等)。

  5. 点击右下角“开始推流”,若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模块下添加record配置

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支持基于密钥的鉴权方式,配置步骤:

  1. 修改SRS配置文件,添加鉴权配置:

rtmp {
listen 1935;
vhost __defaultVhost__ {
auth {
enabled on;
play off; # 拉流是否鉴权(off关闭,on开启)
publish on; # 推流鉴权开启
publish_key mysecretkey; # 鉴权密钥(自定义,需保密)
publish_url /live/([^/]+); # 匹配推流路径(live/流名称)
}
}
}

  1. 推流时,需在推流URL中添加鉴权参数(timestamp+md5签名),格式:
    rtmp://服务器IP/live/流名称?sign=md5(流名称+timestamp+密钥)&timestamp=当前时间戳
    其中,timestamp为当前Unix时间戳(秒),sign为MD5加密后的字符串(流名称、timestamp、密钥拼接后的字符串)。

  2. 示例(流名称test123,密钥mysecretkey,timestamp=1699999999):
    拼接字符串:test1231699999999mysecretkey
    MD5签名(可通过在线MD5工具计算):abcdef1234567890
    最终推流URL:rtmp://服务器IP/live/test123?sign=abcdef1234567890&timestamp=1699999999

  3. 在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 {

转码为720P,码率1500kbps

                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 拉流失败(浏览器/播放器无法播放)

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/)或在官方社区提问

225 1 3
1个评论

卷心菜

我做了一个网站,支持使用srs进行webrtc直播,欢迎体验:https://live.codeemo.cn/

卷心菜

480
积分
0
获赞数
0
粉丝数
2025-04-25 加入
🔝