当前位置: 首页 > news >正文

【RTSP】客户端(四) 解复用器

逻辑总结

解复用的RTP流工具,RTP 流可以携带多种不同类型的数据(音频、视频等),解复用器通过 InputData 方法接收 RTP 数据并通过回调将音频或视频数据传递给实现了 RTPDemuxerInterface 的类。通过这种方式,RTP 数据可以被解码并播放,或者进行进一步的处理

回调机制实现

  • RTPDemuxer 通过 SetCallBack 方法设置一个回调接口(RTPDemuxerInterface)。通过该接口,RTPDemuxer 可以将解复用后的音频和视频数据传递给外部实现。
  • 在处理 RTP 数据时,RTPDemuxer 可能会调用 OnVideoDataOnAudioData 来通知外部类,分别传递解复用的视频或音频数据。

数据输入与处理逻辑

外部代码可以调用 InputData 方法,将 RTP 数据输入到 RTPDemuxer 类中。根据输入数据的内容,RTPDemuxer 会解复用并调用回调函数,将音频或视频数据传递给实现了 RTPDemuxerInterface 接口的类

负载类型设置

 SetPayloadType 方法允许设置数据的负载类型(如音频或视频编码格式),帮助解复用器区分数据的类型。负载类型可以用于解析 RTP 包并提取正确的音视频数据

原理总结

整体流程类似于一个外卖点餐系统

  • 外卖客户(RTPDemuxerInterface):负责接收音频和视频数据,就像客户接受视频片段或歌曲一样。
  • 厨房(RTPDemuxer):根据顾客的需求,准备视频或音频菜品,并通过回调将其交给外卖客户。
  • 数据流转:通过厨房(解复用器)处理 RTP 数据流,并根据顾客需求(回调)将视频或音频数据分别送达顾客

外卖客户(RTPDemuxerInterface)

class RTPDemuxerInterface {
public:
  virtual void OnVideoData(int64_t pts, const uint8_t* data, size_t size) = 0; //video demuxer only
  virtual void OnAudioData(int64_t pts, const uint8_t* data, size_t size) = 0; //audio demuxer only
};

类似于最终接收数据的客户,其基本需求就是想要音频和视频两种类型的数据

厨房(RTPDemuxer)

负责将食材(RTP 数据流)处理成餐品(音视频数据)的地方。厨师会根据客户的需求做不同的菜品(音频或视频)

class RTPDemuxer{
public:
  virtual void InputData(const uint8_t* data, size_t size) = 0;
  void SetCallBack(RTPDemuxerInterface *call_back) {call_back_ = call_back; return;}
  void SetPayloadType(int payload){payload_ = payload; return;}
protected:
  RTPDemuxerInterface *call_back_ = NULL;
  int payload_;
};
  • InputData:顾客(外卖客户)将食材(原料数据)交给厨师,厨师开始处理。这里的食材就是原始的 RTP 数据流
  • SetCallBack:厨师接到外卖订单,并知道客户对食物的具体需求(电影或者音乐)。厨师将客户(回调接口)和订单(RTP 数据流)进行配对,确保最后的菜品送到对的客户手中
  • SetPayloadType:顾客(外卖客户)指定需要的菜肴类型(如:电影或歌曲)。厨师需要知道要做的是电影(视频)还是歌曲(音频)

实现逻辑分析

假设厨房收到一份订单,顾客要一份包含电影片段的视频数据和一份包含歌曲的音频数据。厨房(厨师)会根据这份订单将数据处理成视频和音频,并通过回调将菜肴(数据)送到顾客(外卖客户)手中

通过该种逻辑将客户和厨房进行分离,厨房(解复用器)和顾客(回调接口)之间保持解耦。厨师并不知道每个顾客的具体需求,它只负责处理好订单并通过回调送去

实现分析

RTPDemuxerInterface 类

定义两个纯虚函数,分别用于处理视频和音频的数据         

class RTPDemuxerInterface {
public:
  virtual void OnVideoData(int64_t pts, const uint8_t* data, size_t size) = 0; //video demuxer only
  virtual void OnAudioData(int64_t pts, const uint8_t* data, size_t size) = 0; //audio demuxer only
};

RTPDemuxer 类

class RTPDemuxer{
public:
  virtual void InputData(const uint8_t* data, size_t size) = 0;
  void SetCallBack(RTPDemuxerInterface *call_back) {call_back_ = call_back; return;}
  void SetPayloadType(int payload){payload_ = payload; return;}
protected:
  RTPDemuxerInterface *call_back_ = NULL;
  int payload_;
};

基础类,负责提供RTP数据处理的核心功能

  • InputData:接收RTP数据包,然后提取出其中的音视频数据
  • SetCalllBack:设置回调函数
  • SetPayloadType:设置数据的负载类型

整体代码

#ifndef RTP_DEMUXER_
#define RTP_DEMUXER_
#include <iostream>
#include <stdint.h>
#include <arpa/inet.h>
#include "rtsp_common.h"

class RTPDemuxerInterface {
public:
  virtual void OnVideoData(int64_t pts, const uint8_t* data, size_t size) = 0; //video demuxer only
  virtual void OnAudioData(int64_t pts,  const uint8_t* data, size_t size) = 0; //audio demuxer only
};

class RTPDemuxer{
public:
  virtual void InputData(const uint8_t* data, size_t size) = 0;
  void SetCallBack(RTPDemuxerInterface *call_back) {call_back_ = call_back; return;}
  void SetPayloadType(int payload){payload_ = payload; return;}
protected:
  RTPDemuxerInterface *call_back_ = NULL;
  int payload_;
};
#endif

相关文章:

  • easypoi导入Excel兼容日期和字符串格式的日期和时间
  • HCIA-AI人工智能笔记2:大模型演进趋势
  • Dify Docker 私有化部署遇到的问题
  • 合React宝宝体质的自定义节流hook
  • Compose 实践与探索十 —— 其他预先处理的 Modifier
  • vscode python相对路径的问题
  • 基于 Verilog 的数字电路设计与仿真:乘数器与多路复用器实践
  • LVGL第三方库的使用(中文库)
  • windows协议不再续签,华为再无windows可用,将于四月发布鸿蒙PC
  • Vue3 开发的 VSCode 插件
  • 996引擎 - 红点系统
  • 前端面试题---vue项目打包时, 内存不足了怎么办 为什么会出现这样的情况
  • SpringBoot事件驱动
  • 翻硬币问题
  • 【Docker compose】neo4j容器安装apoc插件
  • 医疗送药机器人“空间拓扑优化+动态算法决策+多级容错控制”三重链式编程技术解析与应用
  • 【WiFi 7核心技术及未来挑战】
  • 搭建刷题专业版小程序系统
  • 【机器学习chp13--(上)】人工神经网络(MLP结构 + KAN结构 + 卷积神经网络)
  • AI Agent 时代开幕-Manus AI与OpenAI Agent SDK掀起新风暴
  • 竞彩湃|巴萨客场淘汰国际米兰,巴黎双杀阿森纳
  • 世界哮喘日丨张旻:哮喘的整体诊断率不足三成,吸入治疗是重要治疗手段
  • 五一档观众最满意《水饺皇后》
  • 山东滕州一车辆撞向公交站台致多人倒地,肇事者被控制,案件已移交刑警
  • 法国宣布投资1亿欧元吸引外国科研人员
  • 五一上海楼市热闹开局:售楼处全员到岗,热门楼盘连续触发积分