🎬 第七章 流媒体开源库简介
📄 一句话概括

EasyDarwin 的骨架来自苹果的 Darwin Streaming Server, 做的是「RTSP 收、RTMP 发」。

📝 本节和前面几节的关系

7.3 讲播放端,这一节转到服务端的另一条路线。 7.4.2 与 7.4.3 分别讲它的商业版与云平台。

一、它的血统

源自苹果的 Darwin Streaming Server, 那是最早的开源 RTSP 服务器之一。 国内团队把它改成 Windows 友好、加了 Web 管理页与 RTMP 转发。 所以它的骨架是「成熟的 RTSP 服务」,不是从零写的。

这一点决定了它的性格: RTSP 部分极其稳定(毕竟跑了很多年), 而扩展出来的功能(转发、管理、级联)成熟度就差一些。

二、一个进程监听多个端口

实测在同一进程里绑两个端口都能成功: 一个给 RTSP 收流、一个给 RTMP 转发。 真实部署里 RTSP 常是 554、RTMP 常是 1935 或 10086。

顺带说一下 554 的麻烦: 它是 1024 以下的特权端口,Linux 上非 root 绑不了。 所以要么用 root 起、要么设 CAP_NET_BIND_SERVICE、 要么前面挂一层转发。

第三个办法在生产上最常用: 用普通用户跑服务,让 Nginx 或 iptables 把 554 转到 10554。 这样服务本身没有特权,被攻破的损失也小。

三、它的定位

设备侧接入的「小而稳」的选择: 摄像头的 RTSP 推上来,它转成 RTMP 给流媒体服务器。

功能不多,但跑几年不出事——这类项目最看重的就是这个。 很多安防项目的接入层用的就是它。

为什么不用 SRS 或 ZLMediaKit 直接收 RTSP? 因为那些项目的主战场是 RTMP 与 WebRTC,RTSP 只是附带支持。 而 EasyDarwin 的 RTSP 是「祖传代码」,边界条件处理得更细。

四、动手 Demo:EasyDarwin——RTSP 收、RTMP 发,两个端口

先讲清它的血统与定位,再真验证「一个进程绑两个端口」。 顺带说明为什么 554 这个端口特别麻烦。

import socket

socks, ports = [], []
for _ in range(2):
    s = socket.socket()
    s.bind(("127.0.0.1", 0))
    s.listen(4)
    socks.append(s)
    ports.append(s.getsockname()[1])

print("RTSP 收流端口 %d" % ports[0])
print("RTMP 转发端口 %d" % ports[1])
print("两个 socket 在同一进程里各自 listen")

# 验证:两个端口都能连上
for p in ports:
    c = socket.create_connection(("127.0.0.1", p), timeout=2)
    print("  连 %d 成功" % p)
    c.close()

for s in socks:
    s.close()

实跑输出:

--------------------------------------------------------------------
EasyDarwin——RTSP 收、RTMP 发,两个端口
--------------------------------------------------------------------
**① 它的血统**

  **源自苹果的 Darwin Streaming Server,那是最早的开源 RTSP 服务器之一。**
  **国内团队把它改成 Windows 友好、加了 Web 管理页与 RTMP 转发。**
  **所以它的骨架是「成熟的 RTSP 服务」,不是从零写的。**

**② 真验证「一个进程能监听两个端口」**

  用途          端口
  -----------------------
  RTSP 收流     49283
  RTMP 转发     49284

  **两个 socket 都在同一个进程里,各自 listen——这就是「一进程多端口」。**
  **真实部署里 RTSP 常是 554、RTMP 常是 1935 或 10086。**

  **顺带说一下 554 的麻烦:**
  **它是 1024 以下的特权端口,Linux 上非 root 绑不了。**
  **所以要么用 root 起、要么设 `CAP_NET_BIND_SERVICE`、要么前面挂一层转发。**

**③ 它的定位**

  **设备侧接入的「小而稳」的选择:**
  **摄像头的 RTSP 推上来,它转成 RTMP 给流媒体服务器。**
  **功能不多,但跑几年不出事——这类项目最看重的就是这个。**

绑 0 号端口表示「随便给我一个」,系统分配后可以用 getsockname 读回来。 两个端口都能连上,说明「一进程多端口」不是特例,是常规操作。 真实项目里这两个端口是写死在配置里的,因为客户端要知道往哪连。

30 秒实验

  1. 试着绑 80 端口,看会不会报权限错——Windows 上通常可以,Linux 上非 root 会报 Permission denied。
  2. 把第二个端口改成和第一个一样,看报什么错——EADDRINUSE,端口被占用。
  3. 绑 0.0.0.0 而不是 127.0.0.1,想想差别——前者对所有网卡开放,后者只有本机能连。

常见误区

  1. 「一个进程只能监听一个端口」——可以监听任意多个。
  2. 「554 一定要 root」——可以用端口转发或授权能力绕过。
  3. 「EasyDarwin 是自己从头写的」——骨架来自 Darwin Streaming Server。
自测三问(点开对答案) 1. EasyDarwin 的技术血统是什么? —— **苹果的 Darwin Streaming Server**,它是最早的开源 RTSP 服务器之一。 2. 为什么 554 端口麻烦? —— **1024 以下是特权端口**,非 root 绑不了,要授权或转发。 3. 它的典型用法是什么? —— **摄像头 RTSP 推上来,转成 RTMP 给流媒体服务器。**

相关笔记