mediasoup源码走读(十二)——router

十二、router


12.1、Router 核心定位与模块交互

Router 是 Mediasoup 的"媒体流中枢",其核心价值体现在:

  • 媒体路由:管理 Producer 与 Consumer 之间的 RTP 包交换
  • 房间管理:作为多方会议的逻辑容器
  • 资源协调:协调 Transport、Producer、Consumer 的生命周期
  • 动态策略:支持 Simulcast/SVC 编码层切换

模块交互全景图
创建/管理 注册/管理 订阅/管理 网络通道 进程通信 媒体流发布 媒体流接收 网络传输 Router Worker Producer Consumer Transport Network


12.2、端到端工作流程

应用层 Mediasoup Router Producer Consumer Transport Worker进程 createRouter(mediaCodecs) 创建Router实例 注册到Worker管理 createProducer(transport) 创建Producer实例 注册到Router管理 createConsumer(producer) 创建Consumer实例 注册到Router管理 SendRtpPacket(packet) ForwardRtpPacket(packet) 触发track事件 loop [媒体流转发] close() 通知关闭 确认关闭 通知关闭 确认关闭 通知关闭 确认关闭 应用层 Mediasoup Router Producer Consumer Transport Worker进程


12.3、关键模块交互代码

12.3.1 Router 与 Worker 的进程通信

Worker 创建 Router

cpp 复制代码
// mediasoup/src/Worker.cpp
Router* Worker::CreateRouter(
  const std::vector<MediaCodec>& mediaCodecs
) {
  // 1. 生成唯一ID
  std::string id = GenerateId("router");
  
  // 2. 创建Router实例
  Router* router = new Router(
    this, id, mediaCodecs
  );
  
  // 3. 注册到Worker管理
  routers_.insert({id, router});
  
  return router;
}

Router 与 Worker 的 IPC 通信

cpp 复制代码
// mediasoup/src/Router.cpp
void Router::SendToWorker(const std::string& method, const json& data) {
  worker_->SendRequest(method, data);
}
12.3.2 Router 与 Producer 的媒体路由

Router 创建 Producer

cpp 复制代码
// mediasoup/src/Router.cpp
Producer* Router::CreateProducer(
  Transport* transport,
  const std::string& trackId,
  const std::string& trackKind,
  const std::string& codec,
  const std::string& codecOptions,
  const std::vector<Encoding>& encodings
) {
  // 1. 生成唯一ID
  std::string id = GenerateId("producer");
  
  // 2. 创建Producer实例
  Producer* producer = new Producer(
    this, id, transport, trackId, trackKind, codec, 
    codecOptions, encodings
  );
  
  // 3. 注册到Router管理
  producers_.insert({id, producer});
  
  // 4. 通知Worker
  SendToWorker("producer-created", producer->ToJson());
  
  return producer;
}

Producer 关闭时通知 Router

cpp 复制代码
// mediasoup/src/Producer.cpp
void Producer::Close() {
  if (isClosed) return;
  
  isClosed = true;
  Emit("close");
  
  // 通知Router
  router->OnProducerClosed(this);
}

Router 处理 Producer 关闭

cpp 复制代码
// mediasoup/src/Router.cpp
void Router::OnProducerClosed(Producer* producer) {
  producers_.erase(producer->id);
  SendToWorker("producer-closed", {{"id", producer->id}});
}
12.3.3 Router 与 Consumer 的媒体订阅

Router 创建 Consumer

cpp 复制代码
// mediasoup/src/Router.cpp
Consumer* Router::CreateConsumer(
  Transport* transport,
  Producer* producer,
  const std::string& trackId,
  const std::string& trackKind
) {
  // 1. 生成唯一ID
  std::string id = GenerateId("consumer");
  
  // 2. 创建Consumer实例
  Consumer* consumer = new Consumer(
    this, id, transport, producer, trackId, trackKind
  );
  
  // 3. 注册到Router管理
  consumers_.insert({id, consumer});
  
  // 4. 通知Producer
  producer->OnConsumerCreated(consumer);
  
  return consumer;
}

Consumer 关闭时通知 Router

cpp 复制代码
// mediasoup/src/Consumer.cpp
void Consumer::Close() {
  if (isClosed) return;
  
  isClosed = true;
  Emit("close");
  
  // 通知Router
  router->OnConsumerClosed(this);
}

Router 处理 Consumer 关闭

cpp 复制代码
// mediasoup/src/Router.cpp
void Router::OnConsumerClosed(Consumer* consumer) {
  consumers_.erase(consumer->id);
  SendToWorker("consumer-closed", {{"id", consumer->id}});
}
12.3.4 Router 与 Transport 的网络通道管理

Transport 注册到 Router

cpp 复制代码
// mediasoup/src/Transport.cpp
void Transport::RegisterWithRouter(Router* router) {
  router->AddTransport(this);
}

// mediasoup/src/Router.cpp
void Router::AddTransport(Transport* transport) {
  transports_.insert({transport->id, transport});
}

Transport 关闭时通知 Router

cpp 复制代码
// mediasoup/src/Transport.cpp
void Transport::Close() {
  if (isClosed) return;
  
  isClosed = true;
  Emit("close");
  
  // 通知Router
  if (router) {
    router->OnTransportClosed(this);
  }
}

Router 处理 Transport 关闭

cpp 复制代码
// mediasoup/src/Router.cpp
void Router::OnTransportClosed(Transport* transport) {
  transports_.erase(transport->id);
  SendToWorker("transport-closed", {{"id", transport->id}});
}

12.4、Router 的完整生命周期管理

12.4.1 生命流程图

Creating Active Closed

12.4.2 关键生命周期方法

创建

cpp 复制代码
// mediasoup/src/Router.cpp
Router::Router(
  Worker* worker,
  const std::vector<MediaCodec>& mediaCodecs
) : 
  worker(worker),
  id(GenerateId("router")),
  mediaCodecs(mediaCodecs),
  isClosed(false) {
  
  // 1. 注册到Worker
  worker->CreateRouter(this);
  
  // 2. 初始化媒体编解码器
  InitializeCodecs(mediaCodecs);
}

关闭

cpp 复制代码
// mediasoup/src/Router.cpp
void Router::Close() {
  if (isClosed) return;
  
  isClosed = true;
  Emit("close");
  
  // 1. 关闭所有Producer
  for (auto& producer : producers_) {
    producer->Close();
  }
  
  // 2. 关闭所有Consumer
  for (auto& consumer : consumers_) {
    consumer->Close();
  }
  
  // 3. 关闭所有Transport
  for (auto& transport : transports_) {
    transport->Close();
  }
  
  // 4. 通知Worker
  worker->OnRouterClosed(this);
}

12.5、Router 的模块交互与生命周期总结

模块交互核心价值

模块 交互方式 关键作用 交互点体现
Worker 创建/管理/通信 跨进程资源协调 worker->CreateRouter()
Producer 创建/管理/媒体转发 媒体流发布与路由 router->CreateProducer()
Consumer 创建/管理/媒体订阅 媒体流接收与路由 router->CreateConsumer()
Transport 注册/管理/网络通道 网络传输通道管理 router->AddTransport()

关键交互点分析

  1. 媒体路由:Router 作为中央枢纽,协调 Producer 与 Consumer 的媒体流转发
  2. 资源管理:统一管理 Transport、Producer、Consumer 的生命周期
  3. 进程通信:通过 IPC 与 Worker 进程保持同步,确保跨进程一致性
  4. 动态策略:支持 Simulcast/SVC 编码层切换,适应网络变化
相关推荐
仰泳的熊猫2 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
Thera7776 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
yy我不解释6 小时前
关于comfyui的mmaudio音频生成插件时时间不一致问题(一)
python·ai作画·音视频·comfyui
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ7 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
君义_noip7 小时前
信息学奥赛一本通 1952:【10NOIP普及组】三国游戏 | 洛谷 P1199 [NOIP 2010 普及组] 三国游戏
c++·信息学奥赛·csp-s
旖-旎8 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
顶点多余8 小时前
使用C/C++语言链接Mysql详解
数据库·c++·mysql
汉克老师8 小时前
GESP2026年3月认证C++四级( 第二部分判断题(1-10))
c++·指针·函数重载·文件操作·数组·gesp4级·gesp四级
Sendingab8 小时前
2026 年 AI 数字人口播新趋势:智能体 Agent 将如何重构短视频内容生产与营销
人工智能·重构·音视频
05大叔8 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络