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 秒实验
- 试着绑 80 端口,看会不会报权限错——Windows 上通常可以,Linux 上非 root 会报 Permission denied。
- 把第二个端口改成和第一个一样,看报什么错——EADDRINUSE,端口被占用。
- 绑
0.0.0.0而不是127.0.0.1,想想差别——前者对所有网卡开放,后者只有本机能连。
常见误区
- 「一个进程只能监听一个端口」——可以监听任意多个。
- 「554 一定要 root」——可以用端口转发或授权能力绕过。
- 「EasyDarwin 是自己从头写的」——骨架来自 Darwin Streaming Server。
自测三问(点开对答案)
1. EasyDarwin 的技术血统是什么? —— **苹果的 Darwin Streaming Server**,它是最早的开源 RTSP 服务器之一。 2. 为什么 554 端口麻烦? —— **1024 以下是特权端口**,非 root 绑不了,要授权或转发。 3. 它的典型用法是什么? —— **摄像头 RTSP 推上来,转成 RTMP 给流媒体服务器。**- ☐ (本节完,下一节 7.4.2 EasyDarwin 商业项目)