在M系列 Mac上搭建低延迟直播服务器:SRS完整实战教程
- 2026-02-09
- 阅读:17
适用场景:
- 视频监控直播
- 在线教育/会议
- 游戏直播
- 活动直播
- 任何需要低延迟的实时视频场景
一、为什么选择SRS?

https://github.com/ossrs/srs.git
1 市面上的直播服务器对比
| 方案 | Apple Silicon支持 | 配置难度 | 延迟 | 功能丰富度 |
|---|---|---|---|---|
| SRS | ✅ 原生支持 | ⭐ 简单 | 0.5-1秒 | ⭐⭐⭐⭐⭐ |
| Nginx-rtmp | ❌ 需Rosetta | ⭐⭐⭐ 复杂 | 1-3秒 | ⭐⭐⭐ |
| MediaMTX | ✅ 原生支持 | ⭐⭐ 中等 | 0.3-0.8秒 | ⭐⭐⭐⭐ |
| FFmpeg+FFserver | 已废弃 | ⭐⭐⭐⭐ 很复杂 | 1-2秒 | ⭐⭐ |
SRS的核心优势:
- 真正的原生支持:从SRS 5.0开始,官方就完美支持ARM64架构,不需要Rosetta转译
- 超低延迟:HTTP-FLV模式下延迟只有0.5-1秒(HLS通常要10秒+)
- 功能全面:支持RTMP、HTTP-FLV、HLS、WebRTC、SRT等一大堆协议
- 配置简单:基本上改几行配置就能跑起来
- 性能强悍:单机可以支持上千路并发流
- 文档完善:中英文文档都很齐全,还有活跃的社区
1.2 什么是HTTP-FLV?为什么要用它?
可能有人会问:直播不都是用RTMP吗,为什么还要搞个HTTP-FLV?
简单来说:
RTMP的问题:
- 浏览器原生不支持(Flash已死)
- 需要第三方插件或者转换
- 防火墙可能会拦截(非标准HTTP端口)
HTTP-FLV的优势:
- 基于HTTP协议,天然防火墙友好
- 延迟远低于HLS(0.5秒 vs 10秒+)
- 浏览器通过flv.js可以完美播放
- 可以走CDN,成本低
所以,最佳实践是:
摄像头/OBS → RTMP推流 → SRS服务器 → HTTP-FLV → 浏览器播放
二、安装SRS:比想象中简单得多
2.1 环境准备
系统要求:
- macOS 11.0+(Big Sur及以上)
- Apple Silicon芯片(M1/M2/M3/M4)
- 命令行基础(会用Terminal)
需要安装的工具:
# 安装Xcode Command Line Tools(如果还没装)
xcode-select --install
# 安装Git(通常已自带)
git --version
2.2 克隆SRS源码
打开Terminal,执行:
# 推荐使用最新的6.0版本(更稳定)
git clone -b 6.0release https://github.com/ossrs/srs.git
# 或者使用稳定的5.0版本
# git clone -b 5.0release https://github.com/ossrs/srs.git
cd srs/trunk
为什么不用Homebrew?
Homebrew里的SRS版本可能不是最新的,而且我们需要自己编译来确保完美适配Apple Silicon。好消息是,编译过程非常简单,基本上一键搞定。
2.3 编译(一键完成)
./configure
make
你会看到这样的输出:
Platform: Darwin
OS: macOS
CPU: arm64
Compiler: clang
...
Build successfully!
看到arm64就说明正确识别了你的Apple Silicon芯片。
编译需要多久?
在MacBook Air上,整个编译过程不到3分钟。编译成功后,可执行文件在:
srs/trunk/objs/srs
三、配置HTTP-FLV:关键的一步
3.1 使用官方模板
SRS自带了HTTP-FLV的配置模板,我们直接复制过来改一改就行:
cp conf/http.flv.live.conf conf/my.conf
3.2 编辑配置文件
用你喜欢的编辑器打开conf/my.conf:
# 我用的是VS Code
code conf/my.conf
# 或者用vim
# vim conf/my.conf
# 或者用nano
# nano conf/my.conf
核心配置解读:
# RTMP服务配置
listen 1935; # RTMP推流端口(默认1935)
max_connections 1000; # 最大连接数
daemon off; # 开发时建议关闭daemon,方便看日志
srs_log_tank console; # 日志输出到终端
# HTTP服务配置(重点!)
http_server {
enabled on; # 启用HTTP服务
listen 8081; # HTTP端口(可以改成8080或其他)
dir ./objs/nginx/html; # Web根目录
}
# 虚拟主机配置
vhost __defaultVhost__ {
# HTTP-FLV配置(核心!)
http_remux {
enabled on; # 启用HTTP-FLV
mount [vhost]/[app]/[stream].flv; # URL格式
}
}
配置说明:
listen 1935:RTMP推流端口,这是标准端口,一般不用改listen 8081:HTTP服务端口,用于播放HTTP-FLV流http_remux:这是SRS实现HTTP-FLV的核心模块mount [vhost]/[app]/[stream].flv:定义了HTTP-FLV的URL格式
URL格式举例:
如果你推流到:rtmp://127.0.0.1:1935/live/test
那么HTTP-FLV播放地址就是:http://127.0.0.1:8081/live/test.flv
3.3 高级配置(可选)
如果你想调整性能,可以加入这些配置:
vhost __defaultVhost__ {
# 转码配置(如果需要多码率)
transcode {
enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg;
engine hd {
enabled on;
vcodec libx264;
vbitrate 1200; # 视频码率 1200kbps
acodec aac;
abitrate 128; # 音频码率 128kbps
}
}
# DVR录制(如果需要录像)
dvr {
enabled on;
dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].flv;
dvr_plan session; # 按推流会话录制
}
}
四、启动SRS
4.1 启动命令
./objs/srs -c conf/my.conf
成功启动后,你会看到:
[2024-12-17 14:30:00.000][INFO][1][main] SRS/6.0.0(Bee) linux/arm64 pid=12345
[2024-12-17 14:30:00.000][INFO][1][main] config file: conf/my.conf
[2024-12-17 14:30:00.000][INFO][1][main] http: api mount /api to ./objs/nginx/html
[2024-12-17 14:30:00.000][INFO][1][main] http: serving HTTP stream on http://0.0.0.0:8081
[2024-12-17 14:30:00.000][INFO][1][main] RTMP listen at tcp://0.0.0.0:1935
看到这些日志就说明启动成功了!
4.2 验证服务是否正常
打开浏览器,访问:http://localhost:8081
你应该能看到SRS的欢迎页面和管理后台。
常见启动问题:
问题1:端口被占用
[ERROR] listen at port 1935 failed, Address already in use
解决办法:
# 查看谁占用了端口
lsof -i :1935
# 杀掉占用进程
kill -9 <PID>
# 或者改用其他端口(修改配置文件)
问题2:权限问题
[ERROR] open pid file failed
解决办法:
# 确保有写权限
chmod +x ./objs/srs
五、推流与播放
5.1 使用FFmpeg推流测试
安装FFmpeg(如果还没装):
brew install ffmpeg
推一个测试流(彩色测试图+正弦波音频):
ffmpeg -re -f lavfi -i testsrc=duration=3600:size=1280x720:rate=30 \
-f lavfi -i sine=frequency=1000:duration=3600 \
-c:v libx264 -preset ultrafast -tune zerolatency \
-c:a aac -b:a 128k \
-f flv rtmp://127.0.0.1:1935/live/test
参数解释:
-re:按实时速度读取输入(模拟直播)testsrc:生成测试图(彩色条纹)sine:生成正弦波音频(1000Hz)-c:v libx264:视频编码H.264(必须!)-c:a aac:音频编码AAC(必须!)-preset ultrafast:最快编码速度,适合实时直播-tune zerolatency:零延迟优化
为什么必须用H.264和AAC?
因为HTTP-FLV(以及大部分浏览器播放器)只支持H.264视频和AAC音频。如果用其他编码,浏览器无法播放。
5.2 推摄像头/屏幕流
推Mac摄像头:
ffmpeg -f avfoundation -framerate 30 -i "0:0" \
-c:v libx264 -preset ultrafast -tune zerolatency \
-c:a aac -b:a 128k \
-f flv rtmp://127.0.0.1:1935/live/camera
推屏幕录制:
ffmpeg -f avfoundation -framerate 30 -i "1:0" \
-c:v libx264 -preset ultrafast -tune zerolatency -s 1280x720 \
-c:a aac -b:a 128k \
-f flv rtmp://127.0.0.1:1935/live/screen
提示:macOS可能会弹出权限请求,记得允许Terminal访问摄像头/屏幕录制。
使用OBS推流:
如果你用OBS Studio,配置更简单:
- 打开OBS → 设置 → 推流
- 服务:自定义
- 服务器:
rtmp://127.0.0.1:1935/live - 串流密钥:
mystream(任意名字) - 开始推流
5.3 在浏览器中播放
创建一个HTML播放器:
创建文件player.html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SRS HTTP-FLV 播放器</title>
<script src="https://cdn.jsdelivr.net/npm/flv.js@1.5.0/dist/flv.min.js"></script>
<style>
body {
margin: 0;
padding: 20px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
background: #1a1a1a;
color: #fff;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
h1 {
text-align: center;
color: #4CAF50;
}
video {
width: 100%;
max-width: 800px;
display: block;
margin: 20px auto;
background: #000;
border-radius: 8px;
}
.info {
text-align: center;
color: #888;
margin-top: 10px;
}
</style>
</head>
<body>
<div class="container">
<h1>🎥 SRS HTTP-FLV 直播播放器</h1>
<video id="video" controls autoplay muted></video>
<div class="info" id="info">正在连接...</div>
</div>
<script>
const videoUrl = 'http://127.0.0.1:8081/live/test.flv';
if (flvjs.isSupported()) {
const video = document.getElementById('video');
const info = document.getElementById('info');
const flvPlayer = flvjs.createPlayer({
type: 'flv',
url: videoUrl,
isLive: true,
hasAudio: true,
hasVideo: true
});
flvPlayer.attachMediaElement(video);
flvPlayer.load();
// 播放
flvPlayer.play().then(() => {
info.textContent = '✅ 直播播放中';
}).catch(e => {
info.textContent = '❌ 播放失败: ' + e.message;
console.error('Play failed:', e);
});
// 错误处理
flvPlayer.on(flvjs.Events.ERROR, (errorType, errorDetail, errorInfo) => {
console.error('播放器错误:', errorType, errorDetail, errorInfo);
info.textContent = `❌ 错误: ${errorDetail}`;
});
} else {
document.getElementById('info').textContent = '❌ 你的浏览器不支持 flv.js';
}
</script>
</body>
</html>
打开播放器:
open player.html
或者直接用浏览器打开这个HTML文件。
你应该能看到:
- 彩色测试图(如果推的是测试流)
- 或者摄像头画面(如果推的是摄像头)
- 延迟只有0.5-1秒!
5.4 播放问题排查
问题1:黑屏/无法播放
检查清单:
- 推流是否成功?(看FFmpeg/OBS是否有报错)
- URL是否正确?(检查app名和stream名)
- 编码是否正确?(必须是H.264+AAC)
- 浏览器控制台有无报错?
问题2:延迟很高(>3秒)
可能原因:
- 没有用HTTP-FLV,用了HLS
- 推流端编码设置不对(没有
-tune zerolatency) - 网络问题
问题3:卡顿/掉帧
优化方法:
- 降低视频码率(
-b:v 1000k) - 降低分辨率(
-s 1280x720) - 检查CPU使用率(
top命令)
六、一键启动脚本:
创建start_srs.sh:
#!/bin/bash
# 进入SRS目录
cd "$(dirname "$0")/srs/trunk" || exit 1
# 检查是否已编译
if [ ! -f "./objs/srs" ]; then
echo "❌ SRS未编译,正在编译..."
./configure
make
fi
# 启动SRS
echo "🚀 启动SRS服务器..."
echo "📡 RTMP推流地址: rtmp://127.0.0.1:1935/live/<stream_name>"
echo "🌐 HTTP-FLV播放: http://127.0.0.1:8081/live/<stream_name>.flv"
echo "📊 管理后台: http://127.0.0.1:8081"
echo ""
echo "按 Ctrl+C 停止服务"
echo "---"
./objs/srs -c conf/http.flv.live.conf
赋予执行权限:
chmod +x start_srs.sh
启动服务:
./start_srs.sh
七、进阶技巧
7.1 多路流同时推送
SRS支持同时推送多路流:
# 推流1
ffmpeg ... -f flv rtmp://127.0.0.1:1935/live/stream1
# 推流2
ffmpeg ... -f flv rtmp://127.0.0.1:1935/live/stream2
# 推流3
ffmpeg ... -f flv rtmp://127.0.0.1:1935/live/stream3
播放地址:
http://127.0.0.1:8081/live/stream1.flvhttp://127.0.0.1:8081/live/stream2.flvhttp://127.0.0.1:8081/live/stream3.flv
7.2 鉴权保护(防止盗播)
修改配置文件,加入鉴权:
vhost __defaultVhost__ {
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
# HTTP回调鉴权
http_hooks {
enabled on;
on_publish http://127.0.0.1:8085/api/v1/streams;
on_unpublish http://127.0.0.1:8085/api/v1/streams;
}
}
然后写一个简单的鉴权服务(Python示例):
from flask import Flask, request, jsonify
app = Flask(__name__)
# 允许的流名称列表
ALLOWED_STREAMS = ['test', 'camera', 'screen']
@app.route('/api/v1/streams', methods=['POST'])
def auth_stream():
data = request.json
stream = data.get('stream')
if stream in ALLOWED_STREAMS:
return jsonify({'code': 0}) # 允许
else:
return jsonify({'code': 1}) # 拒绝
if __name__ == '__main__':
app.run(port=8085)
7.3 录制直播内容
在配置文件中添加:
vhost __defaultVhost__ {
dvr {
enabled on;
dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].flv;
dvr_plan session;
}
}
每次推流结束后,会自动保存录像到./objs/nginx/html/live/目录。
7.4 转码多码率
如果你需要同时提供高清和标清版本:
vhost __defaultVhost__ {
transcode {
enabled on;
ffmpeg ./objs/ffmpeg/bin/ffmpeg;
# 高清版(1080p)
engine hd {
enabled on;
vcodec libx264;
vbitrate 2000;
vfps 30;
vwidth 1920;
vheight 1080;
acodec aac;
abitrate 128;
output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_hd;
}
# 标清版(720p)
engine sd {
enabled on;
vcodec libx264;
vbitrate 1000;
vfps 30;
vwidth 1280;
vheight 720;
acodec aac;
abitrate 96;
output rtmp://127.0.0.1:[port]/[app]?vhost=[vhost]/[stream]_sd;
}
}
}
八、性能优化与监控
8.1 性能监控
SRS提供了HTTP API来监控服务器状态:
# 查看服务器信息
curl http://127.0.0.1:8081/api/v1/summaries
# 查看所有流
curl http://127.0.0.1:8081/api/v1/streams
# 查看客户端连接
curl http://127.0.0.1:8081/api/v1/clients
8.2 优化配置
对于高并发场景:
# 增加最大连接数
max_connections 5000;
# 优化缓冲区
vhost __defaultVhost__ {
# 调整GOP缓存
gop_cache on;
queue_length 10;
}
九、总结与最佳实践
经过一番折腾,我总结了以下经验:
✅ 优点
- 安装简单:在Apple Silicon上编译无痛,3分钟搞定
- 延迟超低:HTTP-FLV延迟0.5-1秒,体验极佳
- 配置灵活:支持各种协议和功能
- 性能强悍:单机轻松支持上千路流
- 文档完善:中英文文档齐全
⚠️ 注意事项
- 必须用H.264+AAC编码:其他编码浏览器无法播放
- 防火墙配置:如果要外网访问,记得开放端口
- HTTPS支持:生产环境建议加Nginx反向代理
- 监控报警:建议接入监控系统(如Prometheus)

部分评论