mediasoup源码走读(十一)——consumer

11.1、Consumer 核心定位与模块交互

Consumer 是 Mediasoup 的"媒体流接收者",其核心价值在于:

  • 媒体流订阅:接收 Producer 发送的媒体流
  • 媒体流处理:将 RTP/RTCP 流转换为可被应用层使用的格式
  • 自适应接收:根据网络状况调整接收策略
  • 多路复用:支持单个 Consumer 接收多层编码媒体流

模块交互全景图:
创建/管理 接收RTP包 订阅媒体流 生命周期管理 网络传输 发送媒体流 处理媒体流 Consumer Router Transport Producer Network Producer 应用层


11.2、端到端工作流程

应用层 Mediasoup Router Consumer Transport Producer createConsumer(producer) 创建Consumer实例 注册到Router管理 通知Consumer创建 注册Consumer回调 注册Transport回调 注册Transport回调 SendRtpPacket(packet) OnRtpPacket(packet) 处理RTP包 转换为可播放格式 触发track事件 处理媒体流 loop 媒体流接收 close() 通知关闭 清理资源 通知Consumer关闭 移除Consumer 通知关闭 通知已关闭 应用层 Mediasoup Router Consumer Transport Producer


11.3、关键模块交互代码

11.3.1 Consumer 与 Router 的生命周期交互

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 关闭流程:

cpp 复制代码
// mediasoup/src/Consumer.cpp
void Consumer::Close() {
  if (isClosed) return;
  
  isClosed = true;
  Emit("close");
  
  // 1. 通知Router
  router->CloseConsumer(this);
  
  // 2. 通知Producer
  producer->OnConsumerClosed(this);
  
  // 3. 通知Transport
  transport->OnConsumerClosed(this);
}
11.3.2 Consumer 与 Transport 的数据接收交互

Transport 接收并转发RTP包:

cpp 复制代码
// mediasoup/src/Transport.cpp
void Transport::OnRtpPacket(RtpPacket* packet) {
  // 1. 查找对应的Consumer
  Consumer* consumer = GetConsumerByRtpPacket(packet);
  
  if (!consumer) {
    return; // 未找到Consumer
  }
  
  // 2. 转发给Consumer
  consumer->OnRtpPacket(packet);
}

Consumer 处理RTP包:

cpp 复制代码
// mediasoup/src/Consumer.cpp
void Consumer::OnRtpPacket(RtpPacket* packet) {
  // 1. 检查是否已关闭
  if (isClosed) return;
  
  // 2. 更新统计
  stats.totalPackets++;
  stats.totalBytes += packet->size();
  
  // 3. 通知应用层
  Emit("rtp", packet);
  
  // 4. 处理RTP包(转换为可播放格式)
  ProcessRtpPacket(packet);
}
11.3.3 Consumer 与 Producer 的媒体流交互

Producer 通知 Consumer 创建:

cpp 复制代码
// mediasoup/src/Producer.cpp
void Producer::OnConsumerCreated(Consumer* consumer) {
  // 1. 添加Consumer到列表
  consumers_.insert(consumer);
  
  // 2. 通知Transport
  transport->OnConsumerCreated(consumer);
  
  // 3. 通知Consumer
  consumer->OnProducerCreated(this);
}

Consumer 接收 Producer 通知:

cpp 复制代码
// mediasoup/src/Consumer.cpp
void Consumer::OnProducerCreated(Producer* producer) {
  // 1. 保存Producer引用
  this->producer = producer;
  
  // 2. 设置默认编码层
  SetPreferredEncoding(0);
}
11.3.4 Consumer 与应用层的媒体流处理

Consumer 处理RTP包:

cpp 复制代码
// mediasoup/src/Consumer.cpp
void Consumer::ProcessRtpPacket(RtpPacket* packet) {
  // 1. 检查是否是关键帧
  if (packet->isKeyFrame) {
    // 2. 重置解码器
    ResetDecoder();
  }
  
  // 3. 解码RTP包
  VideoFrame* frame = decoder->Decode(packet);
  
  // 4. 通知应用层
  if (frame) {
    Emit("track", frame);
  }
}

11.4、Consumer 的完整生命周期管理

11.4.1 生命流程图

Creating Active Closed Paused

11.4.2 关键生命周期方法

创建:

cpp 复制代码
// mediasoup/src/Consumer.cpp
Consumer::Consumer(
  Router* router,
  Transport* transport,
  Producer* producer,
  const std::string& trackId,
  const std::string& trackKind
) : 
  router(router),
  transport(transport),
  producer(producer),
  trackId(trackId),
  trackKind(trackKind),
  isClosed(false),
  isPaused(false) {
  
  // 1. 注册到Router
  router->CreateConsumer(this);
  
  // 2. 初始化解码器
  InitializeDecoder();
}

暂停/恢复:

cpp 复制代码
// mediasoup/src/Consumer.cpp
void Consumer::Pause() {
  if (isPaused) return;
  isPaused = true;
  Emit("pause");
}

void Consumer::Resume() {
  if (!isPaused) return;
  isPaused = false;
  Emit("resume");
}

关闭:

cpp 复制代码
// mediasoup/src/Consumer.cpp
void Consumer::Close() {
  if (isClosed) return;
  
  isClosed = true;
  Emit("close");
  
  // 1. 通知Router
  router->CloseConsumer(this);
  
  // 2. 通知Producer
  producer->OnConsumerClosed(this);
  
  // 3. 通知Transport
  transport->OnConsumerClosed(this);
  
  // 4. 清理解码器
  if (decoder) {
    decoder->Close();
    decoder = nullptr;
  }
}

11.5、Consumer 的模块交互与生命周期总结

模块交互核心价值

模块 交互方式 关键作用 交互点体现
Router 创建/管理/关闭 全局生命周期管理 router->CreateConsumer()
Transport 接收RTP包/转发回调 网络数据传输与分发 transport->OnRtpPacket()
Producer 注册Consumer/媒体流分发 提供媒体流与接收端管理 producer->OnConsumerCreated()
应用层 处理媒体流 最终媒体流消费 Emit("track", frame)

关键交互点分析

  1. 媒体流订阅:Consumer 通过 Router 与 Producer 建立连接,实现媒体流订阅
  2. 数据接收:Transport 将网络接收到的 RTP 包转发给 Consumer
  3. 媒体处理:Consumer 将 RTP 包解码为可播放的媒体帧
  4. 应用层交付:Consumer 通过事件将媒体帧传递给应用层

核心认知:Consumer 的价值在于它作为"媒体流接收端",通过与 Router、Transport、Producer 的紧密协作,将网络传输的媒体流转换为应用层可使用的格式。理解这些交互点是构建高质量实时音视频应用的关键。

相关推荐
做萤石二次开发的哈哈4 小时前
连锁门店、园区、交通枢纽的视频如何统一汇集?应用模板的接入与分权管理详解
人工智能·物联网·音视频·二次开发·视频监控·蓝海aiot一站式工作台·萤石云开放平台
david_tym4 小时前
语音降噪模型GTCRN学习笔记(一)
音视频
别动我齐刘海5 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
程序员老陆5 小时前
C++ std::promise深度解析
c++·程序设计
青少儿编程课堂6 小时前
迪杰斯特拉(Dijkstra)算法:单源最短路与赛场路线规划
c++·python·算法·bfs·信息学竞赛
沫璃染墨7 小时前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
道尔柯南8 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
拂拉氏9 小时前
【知识讲解】 Linux之动静态库的了解
linux·运维·服务器·动静态库
Fcy6489 小时前
Linux下 五种IO模型的认识与⾮阻塞IO的实现
linux·服务器·io
aqiu11111110 小时前
【C++算法打怪专栏】C++ `unordered_set` 常用初始化与插入方法总结
开发语言·c++·算法