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.cjanus.c → 插件(如janus_videoroom.c


1.3、Janus如何与其他源码配合使用

1.3.1. 与WebRTC客户端(浏览器/移动端)配合

浏览器 Janus Server rtp.c janus_videoroom.c Other Browser WebSocket信令(创建房间) 返回SDP offer SDP answer 信令响应 浏览器内部处理编解码/NetEQ 发送RTP(视频流) 处理RTP包 转发给其他用户 转发RTP 浏览器处理RTP/渲染 浏览器 Janus Server rtp.c janus_videoroom.c Other Browser

关键点

  • 浏览器:处理编解码、NetEQ、渲染
  • Janus:只转发RTP包,不修改内容
  • 信令:通过WebSocket/HTTP完成

1.3.2. 与SIP系统配合(通过janus_sip.c插件)

SIP Phone Janus Server Browser janus_sip.c SIP信令(INVITE) 处理SIP 创建WebRTC会话 SDP offer SDP answer 媒体中转(RTP) 通过SIP网关转发媒体 SIP Phone Janus Server Browser janus_sip.c

配合方式

  • Janus作为SIP-WebRTC网关
  • janus_sip.c插件处理SIP信令
  • 媒体流通过rtp.c转发

1.3.3. 与直播系统配合(通过janus_streaming.c插件)

RTSP Camera Janus Server Browser janus_streaming.c rtp.c RTSP流 接收RTSP 转换为RTP 转发RTP WebRTC请求 浏览器处理RTP/渲染 RTSP Camera Janus Server Browser janus_streaming.c rtp.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.crtp.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网关
快速开发 开箱即用,插件式 从零开始开发

关键结论

  1. Janus只做两件事:
    • 处理信令(WebSocket/HTTP)
    • 转发RTP包(通过rtp.c
  2. 不处理:编解码、NetEQ、视频渲染
  3. 与WebRTC客户端配合:
    • 浏览器:处理媒体内容
    • Janus:只做信令和RTP转发

“Janus的智慧在于:它不试图成为一切,而是专注于自己能做得最好的部分——让WebRTC的潜力真正释放出来。”

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐