A帮手 - 常用软件下载安装教程 | 网盘资源下载 | 绿色软件下载

在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的核心优势

  1. 真正的原生支持:从SRS 5.0开始,官方就完美支持ARM64架构,不需要Rosetta转译
  2. 超低延迟:HTTP-FLV模式下延迟只有0.5-1秒(HLS通常要10秒+)
  3. 功能全面:支持RTMP、HTTP-FLV、HLS、WebRTC、SRT等一大堆协议
  4. 配置简单:基本上改几行配置就能跑起来
  5. 性能强悍:单机可以支持上千路并发流
  6. 文档完善:中英文文档都很齐全,还有活跃的社区

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,配置更简单:

  1. 打开OBS → 设置 → 推流
  2. 服务:自定义
  3. 服务器:rtmp://127.0.0.1:1935/live
  4. 串流密钥:mystream(任意名字)
  5. 开始推流

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:黑屏/无法播放

检查清单:

  1. 推流是否成功?(看FFmpeg/OBS是否有报错)
  2. URL是否正确?(检查app名和stream名)
  3. 编码是否正确?(必须是H.264+AAC)
  4. 浏览器控制台有无报错?

问题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.flv
  • http://127.0.0.1:8081/live/stream2.flv
  • http://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;
}

九、总结与最佳实践

经过一番折腾,我总结了以下经验:

✅ 优点

  1. 安装简单:在Apple Silicon上编译无痛,3分钟搞定
  2. 延迟超低:HTTP-FLV延迟0.5-1秒,体验极佳
  3. 配置灵活:支持各种协议和功能
  4. 性能强悍:单机轻松支持上千路流
  5. 文档完善:中英文文档齐全

⚠️ 注意事项

  1. 必须用H.264+AAC编码:其他编码浏览器无法播放
  2. 防火墙配置:如果要外网访问,记得开放端口
  3. HTTPS支持:生产环境建议加Nginx反向代理
  4. 监控报警:建议接入监控系统(如Prometheus)

 

部分评论