ubuntu 安装 SRS (Simple RTMP Server) 是一个开源的流媒体服务器
通过以上步骤,即可在 Ubuntu 上成功安装并运行 SRS 流媒体服务器。如需更复杂的配置(如集群、HTTPS 等),可参考。已支持 RTMP 推流(端口 1935)和 HLS 分发(端口 8080),可直接使用。如果需要自定义配置(如开启 HTTPS、WebRTC 等),可在。从 GitHub 克隆最新的 SRS 源码(也可指定版本,如。测试推流和拉流(需本地安装。SRS 的核心配置文件为。,
在 Ubuntu 系统上安装 SRS(Simple RTMP Server)可以按照以下步骤操作,适用于 Ubuntu 16.04 及以上版本:
一、推流协议
-
RTMP通过
rtmp { listen 19350; }配置,支持客户端使用 RTMP 协议推流,推流地址格式为:rtmp://你的服务器IP:19350/live/流名称(例如rtmp://175.27.158.198:19350/live/test)。 -
WebRTC通过
rtc_server和rtc { enabled on; rtmp_to_rtc on; rtc_to_rtmp on; }配置,支持 WebRTC 推流。推流地址需结合 WebRTC 客户端实现,通常格式为:webrtc://你的服务器IP:8000/live/流名称(例如webrtc://175.27.158.198:8000/live/test)。
二、拉流协议
-
RTMP支持通过 RTMP 协议拉流,地址格式与推流一致:
rtmp://你的服务器IP:19350/live/流名称。 -
HTTP-FLV通过
http_server { enabled on; listen 8081; }和http_remux { enabled on; }配置,支持 HTTP-FLV 拉流,地址格式为:http://你的服务器IP:8081/live/流名称.flv(例如http://175.27.158.198:8081/live/test.flv)。 -
HLS通过
hls { enabled on; }配置,支持 HLS 拉流,地址格式为:http://你的服务器IP:8081/live/流名称.m3u8(例如http://175.27.158.198:8081/live/test.m3u8)。 -
WebRTC支持通过 WebRTC 协议拉流,地址格式与推流一致:
webrtc://你的服务器IP:8000/live/流名称。
- 推流支持:RTMP、WebRTC。
- 拉流支持:RTMP、HTTP-FLV、HLS、WebRTC。
版本是
ubuntu@VM-16-17-ubuntu:/home/zhibo/srs/trunk$ sudo ./objs/srs -v
7.0.117
步骤 1:安装依赖
首先安装编译所需的依赖工具:
bash
sudo apt-get update
sudo apt-get install -y git gcc g++ make automake autoconf libtool pkg-config
sudo apt update && sudo apt install -y openssl libssl-dev ffmpeg libavutil-dev libavcodec-dev libavformat-dev libswscale-dev libgmp-dev libbrotli-dev libcurl4-openssl-dev libxml2-dev
步骤 2:克隆 SRS 源码
从 GitHub 克隆最新的 SRS 源码(也可指定版本,如 v5.0.182):
bash
git clone https://github.com/ossrs/srs.git
cd srs/trunk # 进入源码主目录
如果仓库较大(SRS 是流媒体服务器,历史提交较多),可能因缓存不足导致下载源代码失败,增大缓存限制就可以正常下载了,命令如下:
git config --global http.postBuffer 524288000 # 设置为 500MB
步骤 3:编译 SRS
使用默认配置编译(支持 RTMP、HLS 等主流协议):
bash
或复杂的功能
./configure \
--with-ssl \
--with-rtc \
--with-ffmpeg \
--with-transcode \
--with-ingest \
--with-stat \
--with-gmp
./configure # 生成编译配置
make # 编译源码(耗时约 1-5 分钟,取决于硬件)
生成编译配置成功的如下
ubuntu@VM-16-17-ubuntu:/home/zhibo/srs/trunk$ sudo ./configure \
> --with-ssl \
> --with-rtc \
> --with-ffmpeg \
> --with-transcode \
> --with-ingest \
> --with-stat \
> --with-gmp
Export SRS_JOBS=--jobs=2
User config: --with-ssl --with-rtc --with-ffmpeg --with-transcode --with-ingest --with-stat --with-gmp
Detail config: --prefix=/usr/local/srs --config=conf/srs.conf --osx=off --hls=on --hds=off --dvr=on --ssl=on --https=on --ssl-1-0=off --ssl-local=off --sys-ssl=off --transcode=on --ingest=on --stat=on --http-callback=on --http-server=on --stream-converter=on --http-api=on --utest=off --srt=on --sys-srt=off --rtc=on --rtsp=off --gb28181=off --simulator=off --cxx11=off --cxx14=off --backtrace=on --ffmpeg-fit=on --sys-ffmpeg=off --ffmpeg-opus=off --nasm=on --srtp-nasm=on --sys-srtp=off --clean=on --gperf=off --gmc=off --gmd=off --gmp=on --gcp=off --gprof=off --static=off --shared-st=off --shared-srt=reserved --shared-ffmpeg=reserved --shared-srtp=reserved --log-verbose=off --log-info=off --log-trace=on --log-level_v2=on --gcov=off --debug=off --debug-stats=off --debug-nack-drop=off --cross-build=off --sanitizer=off --sanitizer-static=off --sanitizer-log=off --single-thread=on --signal-api=off --generic-linux=off --build-cache=on --cc=gcc --cxx=g++ --ar=ar --ld=ld --randlib=randlib
gperf-mp depends on gperf, see: ./configure --help
ubuntu@VM-16-17-ubuntu:/home/zhibo/srs/trunk$
根据配置输出,SRS 已经成功配置,并且包含了我们需要的功能(ssl, rtc, ffmpeg, transcode, ingest, stat, gmp)。现在可以开始编译了。
sudo make
如果需要自定义配置(如开启 HTTPS、WebRTC 等),可在 configure 时添加参数,例如:
bash
./configure --with-ssl --with-webrtc # 开启 SSL 和 WebRTC 支持
make
编译成功的
ttpapi.o ./objs/src/protocol/srs_protocol_http_stack_llhttpadapter.o ./objs/src/protocol/srs_protocol_http_stack_llhttphttp.o ./objs/src/protocol/srs_protocol_srt.o ./objs/src/protocol/srs_protocol_rtc_stun.o ./objs/src/protocol/srs_protocol_rtp.o ./objs/src/protocol/srs_protocol_sdp.o ./objs/src/app/srs_app_server.o ./objs/src/app/srs_app_rtmp_conn.o ./objs/src/app/srs_app_rtmp_source.o ./objs/src/app/srs_app_refer.o ./objs/src/app/srs_app_hls.o ./objs/src/app/srs_app_forward.o ./objs/src/app/srs_app_encoder.o ./objs/src/app/srs_app_st.o ./objs/src/app/srs_app_log.o ./objs/src/app/srs_app_config.o ./objs/src/app/srs_app_stream_bridge.o ./objs/src/app/srs_app_reload.o ./objs/src/app/srs_app_http_api.o ./objs/src/app/srs_app_http_conn.o ./objs/src/app/srs_app_http_hooks.o ./objs/src/app/srs_app_ingest.o ./objs/src/app/srs_app_ffmpeg.o ./objs/src/app/srs_app_utility.o ./objs/src/app/srs_app_edge.o ./objs/src/app/srs_app_heartbeat.o ./objs/src/app/srs_app_http_client.o ./objs/src/app/srs_app_http_static.o ./objs/src/app/srs_app_recv_thread.o ./objs/src/app/srs_app_security.o ./objs/src/app/srs_app_statistic.o ./objs/src/app/srs_app_hds.o ./objs/src/app/srs_app_mpegts_udp.o ./objs/src/app/srs_app_listener.o ./objs/src/app/srs_app_async_call.o ./objs/src/app/srs_app_caster_flv.o ./objs/src/app/srs_app_latest_version.o ./objs/src/app/srs_app_process.o ./objs/src/app/srs_app_dash.o ./objs/src/app/srs_app_fragment.o ./objs/src/app/srs_app_dvr.o ./objs/src/app/srs_app_ng_exec.o ./objs/src/app/srs_app_coworkers.o ./objs/src/app/srs_app_circuit_breaker.o ./objs/src/app/srs_app_factory.o ./objs/src/app/srs_app_stream_token.o ./objs/src/app/srs_app_http_stream.o ./objs/src/app/srs_app_srt_server.o ./objs/src/app/srs_app_srt_listener.o ./objs/src/app/srs_app_srt_conn.o ./objs/src/app/srs_app_srt_source.o ./objs/src/app/srs_app_rtc_conn.o ./objs/src/app/srs_app_rtc_dtls.o ./objs/src/app/srs_app_rtc_network.o ./objs/src/app/srs_app_rtc_server.o ./objs/src/app/srs_app_rtc_source.o ./objs/src/app/srs_app_rtc_api.o ./objs/src/app/srs_app_rtc_codec.o ./objs/src/main/srs_main_server.o ./objs/st/libst.a ./objs/openssl/lib/libssl.a ./objs/openssl/lib/libcrypto.a ./objs/srtp2/lib/libsrtp2.a ./objs/ffmpeg/lib/libavcodec.a ./objs/ffmpeg/lib/libswresample.a ./objs/ffmpeg/lib/libavutil.a ./objs/opus/lib/libopus.a ./objs/srt/lib/libsrt.a -ldl -lpthread -lrt -rdynamic
/usr/bin/ld: warning: md_linux.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
make[1]: Leaving directory '/home/zhibo/srs/trunk'
The build summary:
+------------------------------------------------------------------------------------
For SRS benchmark, gperf, gprof and valgrind, please read:
https://ossrs.net/lts/zh-cn/docs/v7/doc/performance
+------------------------------------------------------------------------------------
|The main server usage: ./objs/srs -c conf/srs.conf, start the srs server
| About HLS, please read https://ossrs.net/lts/zh-cn/docs/v7/doc/hls
| About DVR, please read https://ossrs.net/lts/zh-cn/docs/v7/doc/dvr
| About SSL, please read https://ossrs.net/lts/zh-cn/docs/v7/doc/rtmp-handshake
| About transcoding, please read https://ossrs.net/lts/zh-cn/docs/v7/doc/ffmpeg
| About ingester, please read https://ossrs.net/lts/zh-cn/docs/v7/doc/ingest
| About http-callback, please read https://ossrs.net/lts/zh-cn/docs/v7/doc/http-callback
| Aoubt http-server, please read https://ossrs.net/lts/zh-cn/docs/v7/doc/http-server
| About http-api, please read https://ossrs.net/lts/zh-cn/docs/v7/doc/http-api
| About stream-caster, please read https://ossrs.net/lts/zh-cn/docs/v7/doc/streamer
| (Disabled) About VALGRIND, please read https://github.com/ossrs/state-threads/issues/2
+------------------------------------------------------------------------------------
binaries, please read https://ossrs.net/lts/zh-cn/docs/v7/doc/install
You can:
./objs/srs -c conf/srs.conf
to start the srs server, with config conf/srs.conf.
ubuntu@VM-16-17-ubuntu:/home/zhibo/srs/trunk$
步骤 4:启动 SRS 服务
编译完成后,启动 SRS 服务:注意要进入到:/home/zhibo/srs/trun目录中执行命令
bash
./objs/srs -c conf/srs.conf # 使用默认配置文件启动
默认配置文件 conf/srs.conf 已支持 RTMP 推流(端口 1935)和 HLS 分发(端口 8080),可直接使用。
# 先杀死残留进程
sudo pkill -f srs
打开服务
sudo ./etc/init.d/srs start
- 停止服务:
bash
./etc/init.d/srs stop - 重启服务:
bash
sudo ./etc/init.d/srs restart - 查看服务状态(验证是否运行):
bash
sudo ./etc/init.d/srs status
步骤 5:验证服务是否运行
-
检查 SRS 进程:
bash
ps aux | grep srs若输出包含
./objs/srs -c conf/srs.conf,则表示服务已启动。 -
测试推流和拉流(需本地安装
ffmpeg工具):访问ggfhttps://www.gyan.dev/ffmpeg/builds/下载win10系统版本,解压到目录,进入bin目录,复制目录位置路径,F:\ffmpeg-2025-11-02-git-f5eb11a71d-essentials_build\bin

设置环境变量,把文件路径放在path中

通过windows+R组合键,打开窗口,输入cmd,调用命令行窗口,输入“ffmpeg –version
-
出现这个完成配制可以使用了
- 推流测试(使用本地视频文件):
bash
ffmpeg -re -i your_video.mp4 -c copy -f flv rtmp://localhost/live/test - 拉流测试(RTMP 协议):使用支持 RTMP 的播放器(如 VLC)打开地址:
rtmp://你的服务器IP/live/test - 拉流测试(HLS 协议):访问地址:
http://你的服务器IP:8080/live/test.m3u8
- 推流测试(使用本地视频文件):
步骤 6:设置开机自启动(可选)
若需 SRS 随系统启动,可创建系统服务:
- 创建服务文件:
bash
sudo nano /etc/systemd/system/srs.service - 写入以下内容(注意修改
srs源码路径):ini
[Unit] Description=Simple RTMP Server (SRS) After=network.target [Service] Type=simple WorkingDirectory=/path/to/srs/trunk # 替换为你的 SRS 源码目录 ExecStart=/path/to/srs/trunk/objs/srs -c conf/srs.conf Restart=always [Install] WantedBy=multi-user.target - 启用并启动服务:
bash
sudo systemctl daemon-reload sudo systemctl enable srs sudo systemctl start srs
配置说明
SRS 的核心配置文件为 conf/srs.conf,可根据需求修改:
- RTMP 端口:默认
1935 - HLS 端口:默认
8080,配置在http_server模块 - 推流路径格式:
rtmp://ip:port/app/stream(如rtmp://localhost/live/test中,live是app,test是stream)
停止 SRS
- 临时停止:
bash
./objs/srs -s stop - 若通过系统服务启动,使用:
bash
sudo systemctl stop srs
通过以上步骤,即可在 Ubuntu 上成功安装并运行 SRS 流媒体服务器。如需更复杂的配置(如集群、HTTPS 等),可参考 SRS 官方文档
tail -n 100 /home/zhibo/srs/trunk/objs/srs.log 查看可以查询错误信息,必须进入/home/zhibo/srs/trunk目录中执行
使用教程
关于 SRS 的推流、拉流操作、地址配置及域名设置,这里详细说明如下:
一、推流和拉流的详细操作
推流和拉流需要依赖工具(如 ffmpeg 推流)和播放器(如 VLC、PotPlayer 拉流),具体步骤如下:
1. 准备工具
- 推流工具:安装
ffmpeg(用于推流本地视频或摄像头):bash
sudo apt-get install -y ffmpeg - 拉流工具:本地电脑安装播放器(如 VLC 媒体播放器,跨平台且支持 RTMP、HLS 等协议)。
2. 推流操作(以 RTMP 为例)
SRS 默认配置支持 RTMP 推流,推流地址格式为:rtmp://[服务器IP或域名]:1935/[app]/[stream]
[服务器IP或域名]:你的 Ubuntu 服务器公网 IP 或已解析的域名(如1.2.3.4或live.example.com)。1935:RTMP 默认端口(配置文件中可修改)。[app]:应用名(默认配置中为live,可自定义)。[stream]:流名称(自定义,如test、camera1等)。
示例推流命令:
-
推流本地视频文件:
bash
ffmpeg -re -i /path/to/your/video.mp4 -c:v libx264 -c:a aac -f flv "rtmp://1.2.3.4:1935/live/test"-re:按视频实际帧率推流(避免瞬间推完)。-i:指定输入文件路径。-c:v/-c:a:指定视频 / 音频编码(确保兼容性)。
-
推流摄像头(需服务器有摄像头或通过设备映射):
bash
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -c:a aac -f flv "rtmp://1.2.3.4:1935/live/camera"
3. 拉流操作(支持多协议)
SRS 支持 RTMP、HLS(HTTP-FLV)等拉流协议,地址格式根据协议不同而变化:
| 协议 | 拉流地址格式 | 说明 |
|---|---|---|
| RTMP | rtmp://[IP/域名]:1935/[app]/[stream] |
与推流地址相同,直接用于播放器拉流 |
| HLS | http://[IP/域名]:8080/[app]/[stream].m3u8 |
基于 HTTP 的流媒体,适合网页 / 移动端 |
| HTTP-FLV | http://[IP/域名]:8080/[app]/[stream].flv |
基于 HTTP 的 FLV 流,延迟比 HLS 低 |
示例拉流操作:
- 使用 VLC 拉流:打开 VLC → 媒体 → 打开网络串流 → 输入地址(如
rtmp://1.2.3.4:1935/live/test)→ 播放。 - 网页拉流(HLS):用支持 HLS 的播放器(如
video.js),在网页中嵌入地址http://1.2.3.4:8080/live/test.m3u8。
二、推流 / 拉流地址的配置位置
SRS 的核心配置文件是 conf/srs.conf(位于 SRS 源码目录的 trunk/conf 下),推流 / 拉流的端口、应用名等均在此配置:
-
打开配置文件:
bash
cd /path/to/srs/trunk # 进入 SRS 源码目录(替换为你的实际路径) nano conf/srs.conf -
关键配置项说明:
- RTMP 配置(默认支持):
conf
listen 1935; # RTMP 端口 max_connections 1000; vhost __defaultVhost__ { # 应用名配置(如 live,推流地址中的 [app] 需与此一致) app live { enabled on; # HLS 配置(生成 .m3u8 文件) hls { enabled on; hls_path ./objs/nginx/html; # HLS 文件存储路径 hls_fragment 10; # 切片时长(秒) } # HTTP-FLV 配置 http_flv { enabled on; } } } - HTTP 服务器配置(HLS/HTTP-FLV 依赖):
conf
http_server { enabled on; listen 8080; # HTTP 端口(HLS/HTTP-FLV 用) dir ./objs/nginx/html; # 静态文件根目录(存放 .m3u8/.flv) }
- RTMP 配置(默认支持):
-
修改后生效:若 SRS 已启动,需重启服务使配置生效:
bash
# 若通过系统服务启动 sudo systemctl restart srs # 若通过命令直接启动 ./objs/srs -s stop # 停止 ./objs/srs -c conf/srs.conf # 重新启动
三、是否需要配置域名?如何配置?
-
是否需要域名?
- 测试或内网使用:无需域名,直接用服务器 IP 即可(如
192.168.1.100或公网 IP1.2.3.4)。 - 生产环境 / 公网使用:建议配置域名(如
live.example.com),方便记忆和 SSL 证书部署(如需 HTTPS)。
- 测试或内网使用:无需域名,直接用服务器 IP 即可(如
-
域名配置步骤:
- 步骤 1:购买域名并解析在域名服务商(如阿里云、腾讯云)购买域名后,添加 A 记录,将域名解析到你的服务器公网 IP(例如:
live.example.com→1.2.3.4)。 - 步骤 2:在 SRS 中使用域名无需在 SRS 配置中单独设置域名,只需在推流 / 拉流地址中用域名替代 IP 即可(如
rtmp://live.example.com:1935/live/test)。 - 步骤 3:(可选)配置 HTTPS若需通过 HTTPS 拉流(如
https://live.example.com:8080/live/test.m3u8),需在srs.conf中开启 HTTPS 并配置证书:conf
证书可通过 Let's Encrypt 免费申请。http_server { enabled on; listen 8080; # HTTP 端口 https { enabled on; listen 8088; # HTTPS 端口 key /path/to/ssl/private.key; # 私钥路径 cert /path/to/ssl/certificate.crt; # 证书路径 } }
- 步骤 1:购买域名并解析在域名服务商(如阿里云、腾讯云)购买域名后,添加 A 记录,将域名解析到你的服务器公网 IP(例如:
最后测试推流启动,win10电脑命令执行一个视频推流如下:
打开cmd 执行命令开始推流视频
ffmpeg -re -i F:/video/8dd514f9feb9fb414949495a1e39b601.mp4 -c:v libx264 -c:a aac -f flv "rtmp://175.27.158.198:19350/live/test"

观看端拉流如下,
拉流地址是: rtmp://[175.27.158.198]:19350/live/test


添加有限制才可以进行推流和拉流,方法如下
SRS 支持通过配置实现推流 / 拉流的身份验证(如用户名密码校验),防止未授权访问。以下是具体实现方式,主要通过 URL 参数验证 或 HTTP 回调验证 两种方式,适用于不同场景:
方式一:简单验证(URL 参数校验,推荐入门使用)
通过在推流 / 拉流地址中附加密钥参数(如 ?token=xxx),SRS 配置中校验该参数是否匹配,不匹配则拒绝连接。
步骤 1:修改 SRS 配置文件 conf/srs.conf
在 vhost __defaultVhost__ 或具体 app 配置中添加验证规则:
conf
vhost __defaultVhost__ {
app live {
enabled on;
# 推流验证(publish)
publish {
# 允许推流的条件:URL 中必须包含 token=your_secret_key
enabled on;
# 校验规则:检查 query 中的 token 是否等于预设密钥(如 srs@2024)
auth {
enabled on;
# 密钥可自定义,建议复杂一些
token "srs@2024";
# 验证失败时的提示
reject_msg "Invalid publish token";
}
}
# 拉流验证(play)
play {
enabled on;
auth {
enabled on;
token "srs@2024"; # 可与推流密钥相同或不同
reject_msg "Invalid play token";
}
}
# 其他配置(HLS、HTTP-FLV 等保持不变)
hls { ... }
http_flv { ... }
}
}
步骤 2:重启 SRS 使配置生效
bash
sudo systemctl restart srs # 若通过系统服务启动
# 或
./objs/srs -s stop && ./objs/srs -c conf/srs.conf
步骤 3:带验证参数推流 / 拉流
- 推流地址(必须包含
?token=srs@2024):bash
ffmpeg -re -i your_video.mp4 -c copy -f flv "rtmp://服务器IP:1935/live/test?token=srs@2024" - 拉流地址(以 RTMP 和 HLS 为例):
- RTMP:
rtmp://服务器IP:1935/live/test?token=srs@2024 - HLS:
http://服务器IP:8080/live/test.m3u8?token=srs@2024
- RTMP:
如果参数不匹配(如 token 错误或缺失),SRS 会拒绝连接并返回错误信息。
方式二:动态验证(HTTP 回调,适合生产环境)
通过 HTTP 回调机制,SRS 在推流 / 拉流前向你的业务服务器发送请求,由业务服务器判断是否允许访问(如校验数据库中的用户权限),更灵活且支持动态生成密钥。
步骤 1:准备一个验证服务(示例)
假设你有一个简单的 HTTP 服务(如用 Python/Node.js 实现),接收 SRS 的回调请求并返回是否允许:
- 回调请求格式(SRS 会发送):
GET http://你的验证服务器地址/auth?srs_action=publish&srs_stream=test&token=xxx - 验证服务返回:
- 允许:
HTTP 200 OK+ 响应体allow - 拒绝:
HTTP 403 Forbidden或响应体deny
- 允许:
示例 Python 验证服务(简单演示):
python
运行
from flask import Flask, request
app = Flask(__name__)
# 模拟数据库中的有效 token
VALID_TOKENS = {"user1_token", "user2_token"}
@app.route('/auth')
def auth():
action = request.args.get('srs_action') # "publish" 或 "play"
token = request.args.get('token')
if token in VALID_TOKENS:
return "allow" # 允许访问
return "deny", 403 # 拒绝访问
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000) # 启动在 8000 端口
步骤 2:修改 SRS 配置,启用 HTTP 回调
在 conf/srs.conf 中添加回调配置:
conf
vhost __defaultVhost__ {
app live {
enabled on;
# 推流前回调验证
publish {
enabled on;
# 回调到你的验证服务(替换为实际地址)
auth {
enabled on;
# 回调 URL,SRS 会自动附加参数(如 srs_action、srs_stream、token 等)
url "http://你的验证服务器IP:8000/auth";
# 超时时间(毫秒)
timeout 3000;
# 验证失败提示
reject_msg "Auth failed";
}
}
# 拉流前回调验证(与推流配置类似)
play {
enabled on;
auth {
enabled on;
url "http://你的验证服务器IP:8000/auth";
timeout 3000;
}
}
# 其他配置保持不变
hls { ... }
http_flv { ... }
}
}
步骤 3:重启 SRS 并测试
- 启动验证服务(如上面的 Python 程序)。
- 推流时必须携带
token参数(如?token=user1_token),否则验证服务会拒绝。 - 只有
token在VALID_TOKENS中的请求才会被允许。
补充说明
-
安全性增强:
- 方式一中的静态密钥建议定期更换,避免泄露。
- 方式二中的验证服务建议启用 HTTPS(
url "https://..."),防止回调参数被篡改。
-
其他验证方式:
- SRS 还支持 RTMP 私有协议验证(通过
on_publish/on_play回调自定义握手逻辑),适合更复杂的场景,可参考 官方文档。
- SRS 还支持 RTMP 私有协议验证(通过
-
防火墙配合:除了应用层验证,还可通过服务器防火墙(如
ufw)限制端口访问(如只允许特定 IP 访问 1935/8080 端口),双重保障:bash
sudo ufw allow from 允许的IP to any port 1935 # 限制 RTMP 端口 sudo ufw allow from 允许的IP to any port 8080 # 限制 HTTP 端口
通过以上方式,即可有效防止未授权用户随意推流或拉流,确保服务器安全。
使用php开发,tp6框架写的后台方案如下
在 ThinkPHP 6(TP6)中实现 SRS 的动态验证(HTTP 回调),核心是创建一个接口接收 SRS 的回调请求,校验参数后返回 “允许” 或 “拒绝” 的响应。以下是具体实现步骤:
前提准备
- 确保 TP6 项目已正常运行(可通过域名或 IP 访问,如
http://your-domain.com)。 - 了解 SRS 回调的参数:SRS 在推流 / 拉流前会向你的接口发送 GET 请求,携带以下关键参数(可根据需求扩展):
srs_action:操作类型(publish表示推流,play表示拉流)。srs_stream:流名称(如推流地址中的test)。token:推流 / 拉流地址中携带的验证参数(需客户端在地址中附加,如?token=xxx)。
步骤 1:创建验证控制器
在 TP6 项目中创建一个用于处理 SRS 回调的控制器,例如 app/controller/SrsAuth.php:
php
<?php
namespace app\controller;
use think\facade\Request;
use think\response\Json;
class SrsAuth
{
/**
* SRS 推流/拉流验证接口
* 接收 SRS 回调请求,校验 token 合法性
*/
public function check(): Json
{
// 1. 获取 SRS 回调参数
$action = Request::get('srs_action', ''); // 操作类型:publish/play
$stream = Request::get('srs_stream', ''); // 流名称
$token = Request::get('token', ''); // 客户端传递的验证 token
// 2. 日志记录(可选,用于调试)
$logData = [
'time' => date('Y-m-d H:i:s'),
'action' => $action,
'stream' => $stream,
'token' => $token,
'ip' => Request::ip()
];
file_put_contents('./runtime/logs/srs_auth.log', json_encode($logData) . PHP_EOL, FILE_APPEND);
// 3. 验证参数合法性(基础校验)
if (empty($action) || empty($stream) || empty($token)) {
return json('deny', 403); // 参数缺失,拒绝
}
// 4. 核心验证逻辑(根据业务场景实现)
// 示例:从数据库/缓存中校验 token 是否有效
$isValid = $this->validateToken($token, $action, $stream);
// 5. 返回结果(SRS 只识别响应体为 "allow" 或 "deny")
if ($isValid) {
return json('allow', 200); // 允许访问
} else {
return json('deny', 403); // 拒绝访问
}
}
/**
* 验证 token 合法性(业务逻辑)
* @param string $token 客户端传递的 token
* @param string $action 操作类型(publish/play)
* @param string $stream 流名称
* @return bool 是否有效
*/
private function validateToken(string $token, string $action, string $stream): bool
{
// 示例 1:固定 token 测试(实际项目中需替换为数据库查询)
// $validTokens = ['user1_token', 'user2_token'];
// return in_array($token, $validTokens);
// 示例 2:从数据库查询(假设有一个 srs_tokens 表)
$tokenModel = new \app\model\SrsToken(); // 需创建对应模型和表
$tokenInfo = $tokenModel->where([
'token' => $token,
'action' => $action, // 允许的操作类型(publish/play 或 all)
'stream' => $stream, // 允许的流名称(或 * 表示所有流)
'status' => 1, // 有效状态
'expire_time' => ['>', time()] // 未过期
])->find();
return !empty($tokenInfo);
}
}
步骤 2:创建数据模型(可选,用于数据库验证)
如果需要从数据库校验 token,创建对应的模型和数据表:
-
创建迁移文件(生成数据表):执行命令
php think make:migration create_srs_tokens_table,编辑迁移文件:php
public function up() { $this->table('srs_tokens', function ($table) { $table->id(); $table->string('token', 100)->comment('验证令牌'); $table->enum('action', ['publish', 'play', 'all'])->default('all')->comment('允许的操作类型'); $table->string('stream', 50)->default('*')->comment('允许的流名称(* 表示所有)'); $table->tinyInteger('status')->default(1)->comment('状态:1=有效,0=无效'); $table->integer('expire_time')->comment('过期时间(时间戳)'); $table->timestamps(); })->comment('SRS 推流拉流验证令牌表')->create(); }执行迁移:
php think migrate:run生成表。 -
创建模型:
app/model/SrsToken.phpphp
<?php namespace app\model; use think\Model; class SrsToken extends Model { protected $table = 'srs_tokens'; }
步骤 3:配置路由
在 route/app.php 中添加路由,让 SRS 能访问到验证接口:
php
<?php
use think\facade\Route;
// SRS 验证回调接口
Route::get('srs/auth', 'SrsAuth/check');
此时接口地址为:http://你的TP6域名/srs/auth(如 http://1.2.3.4/srs/auth)。
步骤 4:修改 SRS 配置,指向 TP6 验证接口
编辑 SRS 配置文件 conf/srs.conf,在 vhost 或 app 中配置 HTTP 回调:
conf
vhost __defaultVhost__ {
app live {
enabled on;
# 推流验证(publish)
publish {
enabled on;
auth {
enabled on;
# 指向 TP6 的验证接口(替换为你的实际地址)
url "http://你的TP6域名/srs/auth";
timeout 3000; # 超时时间(毫秒)
reject_msg "Publish auth failed"; # 验证失败提示
}
}
# 拉流验证(play)
play {
enabled on;
auth {
enabled on;
url "http://你的TP6域名/srs/auth"; # 与推流共用一个接口
timeout 3000;
reject_msg "Play auth failed";
}
}
# 其他配置(HLS/HTTP-FLV 等)
hls {
enabled on;
}
http_flv {
enabled on;
}
}
}
步骤 5:重启服务并测试
- 重启 SRS 使配置生效:
bash
sudo systemctl restart srs - 测试推流(需携带
token参数):bash
# 假设数据库中存在有效的 token=valid_token_123 ffmpeg -re -i test.mp4 -c copy -f flv "rtmp://你的SRS服务器IP:1935/live/test?token=valid_token_123" - 测试拉流(同样需要携带
token):- RTMP:
rtmp://你的SRS服务器IP:1935/live/test?token=valid_token_123 - HLS:
http://你的SRS服务器IP:8080/live/test.m3u8?token=valid_token_123
- RTMP:
关键说明
- 响应格式:SRS 只根据响应体判断是否允许(
allow允许,deny拒绝),HTTP 状态码建议配合使用(200 对应 allow,403 对应 deny)。 - 安全性:
- 生产环境建议将 TP6 接口改为 HTTPS(
url "https://你的域名/srs/auth"),避免 token 被明文传输。 - 可在 TP6 中添加 IP 白名单,只允许 SRS 服务器的 IP 访问验证接口(防止恶意请求)。
- 生产环境建议将 TP6 接口改为 HTTPS(
- 动态 token:实际业务中,
token可通过业务系统生成(如关联用户、时效限制等),并存储到数据库,验证时查询匹配。
通过以上步骤,即可在 TP6 中实现 SRS 的动态验证,灵活控制推流和拉流权限。
/home/zhibo/srs/trunk/conf/srs.conf文件配制内容是,无授权版本
# main config for srs.
# @see full.conf for detail config.
max_connections 600;
#srs_log_tank file;
#srs_log_file ./objs/srs.log;
daemon on;
rtmp {
listen 19350;
}
http_api {
enabled on;
listen 1985;
}
http_server {
enabled on;
listen 8081;
dir ./objs/nginx/html;
}
rtc_server {
enabled on;
listen 8000; # UDP port
# @see https://ossrs.io/lts/en-us/docs/v7/doc/webrtc#config-candidate
candidate $CANDIDATE;
# 替换为服务器的实际 IP(公网或内网)
candidate 175.27.158.198; # 例如你的服务器公网 IP
}
vhost __defaultVhost__ {
hls {
enabled on;
hls_fragment 10; # 切片时长(秒)
hls_window 60; # 保留的切片窗口(秒)
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
rtc {
enabled on;
# @see https://ossrs.io/lts/en-us/docs/v7/doc/webrtc#rtmp-to-rtc
rtmp_to_rtc on;
# @see https://ossrs.io/lts/en-us/docs/v7/doc/webrtc#rtc-to-rtmp
rtc_to_rtmp on;
}
play{
gop_cache_max_frames 2500;
}
}
基于SRS配置文件的验证需求,可以通过HTTP回调机制实现客户端连接的鉴权认证。以下是在您的配置中添加验证功能的完整方案:
验证配置实现
在vhost __defaultVhost__配置块中添加http_hooks回调配置,用于处理客户端连接、发布和播放等操作的认证1:
# main config for srs.
# @see full.conf for detail config.
max_connections 600;
#srs_log_tank file;
#srs_log_file ./objs/srs.log;
daemon on;
rtmp {
listen 19350;
}
http_api {
enabled on;
listen 1985;
}
http_server {
enabled on;
listen 8081;
dir ./objs/nginx/html;
}
rtc_server {
enabled on;
listen 8000; # UDP port
# @see https://ossrs.io/lts/en-us/docs/v7/doc/webrtc#config-candidate
candidate $CANDIDATE;
# 替换为服务器的实际 IP(公网或内网)
candidate 175.27.158.198; # 例如你的服务器公网 IP
}
vhost __defaultVhost__ {
# HTTP回调验证配置
http_hooks {
enabled on;
on_connect http://你的服务器IP:端口/api/verify; # 连接验证
on_close http://你的服务器IP:端口/api/verify; # 断开连接记录
on_publish http://你的服务器IP:端口/api/verify; # 推流验证
on_unpublish http://你的服务器IP:端口/api/verify; # 停止推流记录
on_play http://你的服务器IP:端口/api/verify; # 播放验证
on_stop http://你的服务器IP:端口/api/verify; # 停止播放记录
}
hls {
enabled on;
hls_fragment 10; # 切片时长(秒)
hls_window 60; # 保留的切片窗口(秒)
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
rtc {
enabled on;
# @see https://ossrs.io/lts/en-us/docs/v7/doc/webrtc#rtmp-to-rtc
rtmp_to_rtc on;
# @see https://ossrs.io/lts/en-us/docs/v7/doc/webrtc#rtc-to-rtmp
rtc_to_rtmp on;
}
play{
gop_cache_max_frames 2500;
}
}
同时留下我的配制文件
# main config for srs.
# @see full.conf for detail config.
max_connections 600;
#srs_log_tank file;
#srs_log_file ./objs/srs.log;
daemon on;
rtmp {
listen 19350;
}
http_api {
enabled on;
listen 1985;
}
http_server {
enabled on;
listen 8081;
dir ./objs/nginx/html;
}
rtc_server {
enabled on;
listen 8000; # UDP port
# @see https://ossrs.io/lts/en-us/docs/v7/doc/webrtc#config-candidate
candidate $CANDIDATE;
# 替换为服务器的实际 IP(公网或内网)
candidate 175.27.158.198; # 例如你的服务器公网 IP
}
vhost __defaultVhost__ {
# HTTP回调验证配置
http_hooks {
enabled on;
on_connect http://zhibo.nmk.com:80/api/verify/connect; # 连接验证
on_close http://zhibo.nmk.com:80/api/verify/close; # 断开连接记录
on_publish http://zhibo.nmk.com:80/api/verify/publish; # 推流验证
on_unpublish http://zhibo.nmk.com:80/api/verify/unpublish; # 停止推流记录
on_play http://zhibo.nmk.com:80/api/verify/play; # 播放验证
on_stop http://zhibo.nmk.com:80/api/verify/stop; # 停止播放记录
}
hls {
enabled on;
hls_fragment 10; # 切片时长(秒)
hls_window 60; # 保留的切片窗口(秒)
}
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
rtc {
enabled on;
# @see https://ossrs.io/lts/en-us/docs/v7/doc/webrtc#rtmp-to-rtc
rtmp_to_rtc on;
# @see https://ossrs.io/lts/en-us/docs/v7/doc/webrtc#rtc-to-rtmp
rtc_to_rtmp on;
}
play{
gop_cache_max_frames 2500;
}
}
验证机制说明
工作原理:
- SRS在客户端执行关键操作时触发HTTP回调
- 验证服务器接收POST请求并解析JSON数据
- 根据操作类型和参数进行权限验证
- 返回"0"表示成功,"1"表示失败
支持的验证事件1:
on_connect:客户端连接验证on_publish:推流权限验证on_play:播放权限验证- 其他事件用于状态记录和监控
安全特性:
- 基于URL参数的身份验证
- 推流和播放权限分离控制
- 详细的错误日志记录
- 防止未授权访问和数据泄露
该验证方案可以有效保护您的SRS服务器,确保只有授权用户才能进行推流和播放操作
验证配置语法
# 使用SRS自带的配置检查工具
./objs/srs -t -c conf/srs.conf
. 查看详细错误日志
tail -n 100 /home/zhibo/srs/trunk/objs/srs.log
在流媒体服务器中执行如下命令可以监推流回调日志变化
tail -f ./objs/srs.log | grep -E "(hook|on_publish|http_hooks|callback)" &
win10命令行执行推流
ffmpeg -re -i F:/video/8dd514f9feb9fb414949495a1e39b601.mp4 -c:v libx264 -c:a aac -f flv "rtmp://175.27.158.198:19350/live/test_stream?token=6c46ccb328ce2796e2b3b644b94634a0%3A1762430646"
循环推流命令是,-stream_loop -1 表示无限循环。
ffmpeg -re -stream_loop -1 -i F:/video/8dd514f9feb9fb414949495a1e39b601.mp4 -c:v libx264 -c:a aac -f flv "rtmp://175.27.158.198:19350/live/test_stream?token=649cd283cd7e5f58001465d298d539d2%3A1762432944"
测试拉流播放也可以通过srs自带在浏览器上的测试,打开方式如下所示
四、总结
- 推流 / 拉流地址:由服务器 IP / 域名 + 端口 + 应用名 + 流名称组成,核心配置在
conf/srs.conf。 - 配置修改:编辑
conf/srs.conf后重启 SRS 生效。 - 域名:非必需,生产环境建议配置,只需解析域名到服务器 IP 即可直接使用。
添加SSL证书,使用WebRTC推流
检查配置文件中的证书路径,确保在 conf 目录下生成了证书文件
cd /home/zhibo/srs/trunk/conf
ls -la srs.key srs.crt
如果证书不存在,重新生成
cd /home/zhibo/srs/trunk/conf
sudo openssl genrsa -out srs.key 2048
sudo openssl req -new -key srs.key -out srs.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=SRS/CN=175.27.158.198"
sudo openssl x509 -req -days 365 -in srs.csr -signkey srs.key -out srs.crt
sudo chmod 400 srs.key
修改配置文件
rtc_server {
enabled on;
listen 8000; # UDP port
candidate 175.27.158.198;
# 证书进行测试
ssl_certificate ./conf/srs.crt;
ssl_certificate_key ./conf/srs.key;
}
重新启动SRS
cd /home/zhibo/srs/trunk
sudo ./etc/init.d/srs restart
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)