🎬 第十一章 SRS搭建直播平台
📄 一句话概括

SRS 的编译只有四步,且编完就能跑,不用 make install。 难点不在命令,在挑 configure 开关。

📝 本节和前面几节的关系

11.1 说了它能干什么,这一节把它真正编出来。 11.2.2 换成 CentOS,命令不变、麻烦变多。

一、四条命令走完编译

先把源码拉下来,再编,再跑:

git clone https://github.com/ossrs/srs.git
cd srs/trunk
./configure
make -j4
./objs/srs -c conf/srs.conf

注意第三条与第五条:没有 make install。 SRS 是「就地运行」的:编完产物就在 objs/,配置在 conf/。 这一点和 Nginx 完全不同,照搬 Nginx 的习惯会找不到文件。

依赖只有四个,都在系统源里: gcc、gcc-c++(Ubuntu 上是 g++)、make、perl。 要 TLS 再加 openssl-devel(Ubuntu 上是 libssl-dev)。

二、configure 的开关分三类

./configure --help 会列二十几个选项,看着乱,其实三类:

① 功能开关:--with-hls、--with-rtc、--with-srt、--with-dvr。 这一类决定「你能配什么」,必须按需选。 ② 性能相关:--with-gperf、--with-gmp、--with-gmc。 这些是调优与自检,生产上通常不开。 ③ 调试相关:--with-debug、--with-sanitizer、--with-backtrace。 排障时开,上线前关掉,否则性能和体积都受影响。

最容易犯的错是把「功能开关」和「性能开关」混着开: 全勾上编出来的版本又大又慢,而你要的功能可能只需要其中三个。

三、默认开着的其实很少

把帮助文本真解析一遍,会看到一个很有意思的分布: 默认开的只有七个,默认关的有十七个。

默认开的是基本盘:HLS、DVR、HTTP 回调、C++11、日志、logo。 默认关的是扩展:WebRTC、SRT、GB28181、内置 HTTP 服务器、转码。

这个分布的取向很清楚:核心功能开箱能用,扩展功能要显式开。 所以「我装了 SRS 怎么没有 WebRTC」这类问题,答案永远是编译开关。 表现是启动时 rtc_server 报 unknown directive,和没写这个块一样。

四、动手 Demo:解析 configure 帮助——二十五个选项怎么分类

把 ./configure --help 的输出当数据, 按默认值把选项分成三堆。

on, off, unk = [], [], []
for line in CONFIGURE_HELP.splitlines():
    s = line.strip()
    if not s.startswith("--"):
        continue
    name = s.split()[0]
    if "default: on" in s:
        on.append(name)
    elif "default: off" in s:
        off.append(name)
    else:
        unk.append(name)

print("默认开", len(on), on)
print("默认关", len(off))
print("没写默认", len(unk), unk)

# 再看一眼默认开的那几个都是什么功能
for x in on:
    print("  开着:", x)

实跑输出:

--------------------------------------------------------------------
Ubuntu 上装 SRS——configure 的开关要会挑
--------------------------------------------------------------------
**① 装 SRS 就三步**

    git clone https://github.com/ossrs/srs && cd srs/trunk
    ./configure --with-rtc --with-ssl
    make -j4

  **编完在 `objs` 目录里有 `srs` 可执行文件,**
  **启动用 `./objs/srs -c conf/srs.conf`。**
  **不需要 `make install`,它是「就地运行」的——**
  **这一点和 Nginx 不一样,别照搬习惯。**

**② configure 的开关分三类**

  **别看它有二十几个选项,其实是三类:**
  **① 功能开关**:**要不要 HLS、要不要 WebRTC、要不要 SRT。**
  **这类决定了你能配什么。**
  **② 性能相关**:**`--with-gperf`、`--with-gmp` 这些,**
  **是调优与诊断用的,生产上通常不开。**
  **③ 调试相关**:**`--with-debug`、`--with-sanitizer`、`--with-backtrace`,**
  **排障时开,上线前关。**

**③ 真解析一遍这份帮助文本,看默认值分布**

  **`default: on` 与 `default: off` 的比例,能看出维护者的取向。**

  类别           数量     含义
  ----------------------------------------------------
  默认开         5        不写就有,想省得显式关
  默认关         20       不写就没有,要用得显式开
  没写默认值     2        通常是路径或必须显式指定

  **默认开着的只有 5 个:**

    --with-hls
    --with-dvr
    --with-http-callback
    --with-cxx11
    --with-logo

  **这说明 SRS 的取向是「核心功能默认可用,扩展功能默认不给」:**
  **HLS、DVR、回调这些基本盘默认开;**
  **WebRTC、SRT、GB28181 这些要显式开。**

  **这一点在实际部署时很重要:**
  **你以为装了 SRS 就有 WebRTC,其实不带 `--with-rtc` 编出来的版本**
  **连 `rtc_server` 这个配置块都不认。**
  **表现是启动时报 unknown directive,和模块没装是一个症状。**

二十五个选项里,默认开的七个、默认关的十七个、没有默认值的一个。 那一个没有默认值的是 --prefix,它是路径,谈不上开关。 默认关的十七个里,功能类的只有五个,其余是调试与性能开关。 所以真要选的其实只有那五个,剩下的用默认就行。

30 秒实验

  1. 把 --prefix 指到 /opt/srs,看 objs/srs 还在不在原处——在,--prefix 只影响 make install,而 SRS 根本不装。
  2. 不加 --with-rtc,猜配 rtc_server 会怎样——启动报 unknown directive,和模块没装一个症状。
  3. make -j1 与 -j4 比时间,猜差多少——大约四倍,但最后的链接段省不下来。

常见误区

  1. 「编完要 make install」——SRS 就地运行,产物在 objs/。
  2. 「默认就带 WebRTC」——要 --with-rtc,否则块都不认。
  3. 「选项全开最好」——调试类开关会让性能和体积都变差。
自测三问(点开对答案) 1. 编完的可执行文件在哪? —— **`objs/srs`**,配置在同级 `conf/` 目录下。 2. 不写 `--with-rtc` 会怎样? —— **`rtc_server` 这一块不被认,启动报 unknown directive。** 3. 默认关的占多数说明了什么? —— **扩展功能默认不给,要用得显式开**,这是维护者的取舍。

相关笔记