janux源码走读(一)源码结构
Janus的智慧在于:它不试图成为一切,而是专注于自己能做得最好的部分——让WebRTC的潜力真正释放出来。请求认证、配置文件解析、日志、事件处理通知、录音录像、抓包…实用工具 Tools and utilities。事件处理 Event Handlers。WebSocket信令(创建房间)传输 Transports。,不涉及编解码或NetEQ。SIP信令(INVITE)返回SDP offer。通
1.1、源码目录
janus-gateway/
├── html/ # Web界面资源
│ ├── index.html
│ ├── videoroom.html
│ ├── audiobridge.html
│ ├── streaming.html
│ ├── sip.html
│ └── ... (其他示例页面)
├── plugins/ # 插件模块(核心业务实现)
│ ├── janus_videoroom.c # 视频会议室插件(SFU核心)
│ ├── janus_audiobridge.c # 音频混音桥插件
│ ├── janus_streaming.c # 流媒体服务插件
│ ├── janus_sip.c # SIP网关插件
│ ├── janus_textroom.c # 文本聊天插件
│ ├── janus_echotest.c # 回声测试插件
│ ├── janus_videoroom_plugin.c # 插件注册入口
│ └── ... (其他插件)
├── transports/ # 传输模块(信令通道)
│ ├── janus_websockets.c # WebSocket实现
│ ├── janus_http.c # HTTP REST API
│ ├── janus_mqtt.c # MQTT传输
│ ├── janus_nanomsg.c # Nanomsg传输
├── events/ # 事件处理模块
│ ├── janus_rabbitmqevh.c
│ ├── janus_kafkaevh.c
│ ├── janus_redisevh.c
├── src/ # 核心模块(基础协议栈)
│ ├── janus.c # 主入口/会话管理
│ ├── ice.c # ICE候选处理
│ ├── dtls.c # DTLS握手
│ ├── sdp.c # SDP解析/生成
│ ├── rtp.c # RTP包处理(关键!)
│ ├── rtcp.c # RTCP包处理
│ ├── utils.c # 工具函数
│ ├── janus_ice.c # ICE辅助函数
│ ├── janus_dtls.c # DTLS辅助函数
│ ├── janus_sdp.c # SDP辅助函数
│ └── janus_rtp.c # RTP辅助函数
├── configs/ # 配置文件
│ ├── janus.jcfg # 主配置
│ ├── janus.cfg.example # 配置示例
│ └── ... (其他配置)
├── docs/ # 文档
│ ├── API.md
│ ├── plugins.md
│ └── ... (其他文档)
├── test/ # 测试脚本
│ ├── test_videoroom.sh
│ └── ... (测试用例)
└── Makefile.am # 自动化构建
模块结构
分5个模块:
-
核心 Core
-
插件 Plugins
-
传输 Transports
-
事件处理 Event Handlers
-
实用工具 Tools and utilities

1.1.1 核心模块(src/)
包含:
-
协议
- DTLS
- ICE
- RTCP
- RTP
- SCTP
- SDP
-
其它
请求认证、配置文件解析、日志、事件处理通知、录音录像、抓包…等
1.1.2 插件模块(Plugins/)

1.1.3 传输模块(Transports/)
-
REST
-
MQTT
-
Nanomsg
-
Unix Sockets
-
RabbitMQ
-
WebSockets

1.1.4 事件处理模块(events/)
-
MQTT
-
RabbitMQ
-
简单事件处理

1.2、关键模块文件作用
1.2.1. 核心模块(src/) - 媒体中转基础
| 文件 | 作用 | 为什么重要 |
|---|---|---|
janus.c |
主入口:会话管理、请求分发、生命周期控制 | 处理所有请求的起点,管理所有插件和会话 |
ice.c |
ICE候选处理:STUN/TURN服务器交互、NAT穿越 | 使WebRTC能穿透防火墙,建立P2P连接 |
dtls.c |
DTLS握手:密钥协商、SRTP加密 | 保证媒体传输安全(WebRTC必须) |
sdp.c |
SDP处理:解析/生成SDP(媒体能力协商) | 交换编解码器、方向等能力信息 |
rtp.c |
RTP包核心处理:包解析、SSRC重写、转发 | 媒体中转的核心! 不处理编解码,只转发RTP包 |
rtcp.c |
RTCP包处理:NACK/PLI/REMB反馈处理 | 保证媒体质量(丢包重传、带宽调整) |
utils.c |
通用工具:日志、JSON解析、内存管理 | 为所有模块提供基础支持 |
💡
rtp.c是Janus唯一处理媒体数据的文件,但只做转发,不涉及编解码或NetEQ
1.2 2. 插件模块(plugins/) - 业务实现层
| 文件 | 作用 | 业务场景 | 与核心模块关系 |
|---|---|---|---|
janus_videoroom.c |
视频会议室核心:SFU架构实现 | 多人视频会议(100+人),支持Simulcast/SVC | 调用rtp.c转发RTP包,通过janus_rtp_send |
janus_audiobridge.c |
音频混音:音频混音处理(AGC/VAD) | 语音会议、客服系统 | 处理音频流,但不编解码,只转发RTP |
janus_streaming.c |
直播服务:RTSP/HLS输入、RTMP推流 | 直播推流、点播 | 接收外部媒体流(如RTSP),通过rtp.c转发 |
janus_sip.c |
SIP网关:WebRTC-SIP转换 | 与传统电话系统互通 | 通过janus_rtp_send转发媒体到SIP网关 |
janus_textroom.c |
文本聊天:消息广播 | 文本聊天室 | 无媒体处理,纯信令交互 |
💡 插件只处理业务逻辑,不处理媒体。例如:
// janus_videoroom.c 关键代码 void janus_videoroom_forward_rtp(janus_videoroom *room, janus_videoroom_session *publisher, janus_rtp_header *header, char *payload, int len) { // 遍历所有订阅者 for (j=0; j<room->subscribers; j++) { // 调用核心模块转发RTP包 janus_rtp_send(subscriber->rtp_socket, header, payload, len); } }
1.2.3. 传输模块(transports/) - 信令通道
| 文件 | 作用 | 为什么重要 |
|---|---|---|
janus_websockets.c |
WebSocket实现:浏览器/移动端主流信令通道 | 低延迟、双向通信,WebRTC客户端首选 |
janus_http.c |
HTTP REST API:兼容性好,适合非实时场景 | 用于移动端/服务器端集成 |
janus_mqtt.c |
MQTT传输:IoT设备接入 | 低带宽、高可靠,适合设备端 |
janus_nanomsg.c |
Nanomsg传输:轻量级内部通信 | 用于Janus集群内部通信 |
💡 信令流程:
浏览器 →janus_websockets.c→janus.c→ 插件(如janus_videoroom.c)
1.3、Janus如何与其他源码配合使用
1.3.1. 与WebRTC客户端(浏览器/移动端)配合
关键点:
- 浏览器:处理编解码、NetEQ、渲染
- Janus:只转发RTP包,不修改内容
- 信令:通过WebSocket/HTTP完成
1.3.2. 与SIP系统配合(通过janus_sip.c插件)
配合方式:
- Janus作为SIP-WebRTC网关
janus_sip.c插件处理SIP信令- 媒体流通过
rtp.c转发
1.3.3. 与直播系统配合(通过janus_streaming.c插件)
配合方式:
janus_streaming.c插件接收RTSP/HLS流- 转换为RTP通过
rtp.c转发 - 浏览器客户端接收RTP并渲染
1.4、Janus这样设计的核心优势
SFU架构优势(比MCU节省90%资源)
| 10人会议 | MCU架构 | Janus SFU架构 |
|---|---|---|
| 媒体流 | 10×10=100条 | 10条(生产者)+ 10条(消费者)=20条 |
| 服务器CPU | 高 | 低 |
| 带宽 | 高 | 低 |
业务扩展性
- 添加新业务:只需写新插件(如
janus_new_feature.c) - 不修改核心:
janus.c、rtp.c等核心文件不变 - 快速迭代:业务变化时,只需更新插件
与WebRTC生态无缝集成
- 使用标准WebRTC API(浏览器端)
- 信令通过标准WebSocket/HTTP
- 媒体处理由浏览器完成(无需额外部署)
1.5、Janus的定位与价值
“Janus不是媒体服务器,而是WebRTC的’高速公路’——它让媒体在客户端之间安全、高效地流动,而无需自己处理内容。”
与传统媒体服务器的区别
| 功能 | Janus | 传统媒体服务器 |
|---|---|---|
| 编解码 | ❌ 不处理 | ✅ 服务器处理(CPU高) |
| NetEQ | ❌ 不处理 | ✅ 服务器处理(延迟高) |
| 媒体流 | ✅ 只转发RTP包 | ✅ 处理原始媒体流 |
| CPU占用 | 低(仅转发) | 高(编解码+NetEQ) |
| 架构 | SFU(媒体中转) | MCU(媒体处理) |
为什么选择Janus
| 业务场景 | Janus方案 | 传统方案 |
|---|---|---|
| 企业视频会议 | 用janus_videoroom.c插件 |
需自研MCU(高成本) |
| 直播推流 | 用janus_streaming.c插件 |
需FFmpeg+媒体服务器 |
| SIP互通 | 用janus_sip.c插件 |
需SIP网关+WebRTC网关 |
| 快速开发 | 开箱即用,插件式 | 从零开始开发 |
关键结论
- Janus只做两件事:
- 处理信令(WebSocket/HTTP)
- 转发RTP包(通过
rtp.c)
- 不处理:编解码、NetEQ、视频渲染
- 与WebRTC客户端配合:
- 浏览器:处理媒体内容
- Janus:只做信令和RTP转发
“Janus的智慧在于:它不试图成为一切,而是专注于自己能做得最好的部分——让WebRTC的潜力真正释放出来。”
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)