本文在上篇的基础上介绍WebRTC视频部分的模块结构,以进一步了解其实现框架,只有了解了整体框架结构,对局部算法修改才能够胸有成竹。

一、对外接口

对外接口有ViEBase,ViECapture,ViECodec,ViEEncryption,ViEFile,ViEImageProcess,ViENetwork,ViERender和ViERTP_RTCP。主要接口有:

1)ViEBase:负责创建和管理视频会话链路;

2)ViECapture:设置采集设备和参数;

3)ViEImageProcess:视频画面处理配置;

4)ViENetwork:通信端口设置;

5)ViERender:渲染设备选择与设置。

与音频类似,对外接口都是通过VideoEngine对象来获取:

ViEInterfaceXX*pInterface = ViEInterfaceXX:GetInterface(pVideoEngine);

二、模块组成

模块之间的关系如图1所示,红色标明的模块与视频产生相关,VideoCaptureModule负责产生视频数据,通过VideoCaptureDataCallback和VideoCaptureFeedback回调传递给采集模块。粉红色标明的模块与视频采集相关,ViECapturer负责采集视频数据,封装成视频帧。通过ViEFrameProviderBase回调注册的ViEFrameCallback的接口。由于ViEEncoder实现了ViEFrameCallback接口,所以视频帧传递给ViEEncoder进行编码,VideoCodingModule一侧模块完成是视频帧的编码工作。此外ViEEncoder实现了VCMPacketizationCallback接口,当编码完视频后,调用该接口通过RtpRtcp模块发送视频帧。绿色标明的模块与视频的渲染相关。ViEChannel负责解码接收的视频帧,解码后通过ViEFrameProviderBase接口将视频帧传递给ViEFrameCallback,由于ViERenderer实现了该接口,所以最终传递到ViERenderer中,ViERenderer负责后续的渲染工作。

图1 模块关系

三、设计模式

WebRTC源码中存在许多类似的场景:

Class CallbackA

{

Virtual void Completed()=0;

}

Class B

{

Public:

B(CallbackA*pCallbackA):Callback_(pCallbackA){}

Void Exec()

{

/**执行某些操作*/

Callback_->Completed();

}

}

Class A:public CallbackA

{

Public:

Void DoThing()

{

m_pB = new B(this);

m_pB->Exec();

delete m_pB;

}

Private:

B* m_pB;

}

之所以使用这种方式,有两方面原因,一方面是层次划分的原因,CallbackA属于A类这一层的调用操作,但是它又必须在B类的某个方法后执行,所以使用回调。另外一方面为了可扩展,允许在现有的结构上实现更多功能。

WebRTC源码分析四:视频模块结构相关推荐

  1. WebRTC源码分析-呼叫建立过程之五(创建Offer,CreateOffer,上篇)

    目录 1. 引言 2 CreateOffer声明 && 两个参数 2.1 CreateOffer声明 2.2 参数CreateSessionDescriptionObserver 2. ...

  2. WebRTC源码分析-呼叫建立过程之四(上)(创建并添加本地音频轨到PeerConnection)

    目录 1. 引言 2. 音频轨创建和添加 2.1 音频源AudioSource的创建 2.1.1 音频源继承树 2.1.2 近端音频源LocalAudioSource 2.1.3 远端音频源Remot ...

  3. FreeCAD源码分析:FreeCADGui模块

    FreeCAD源码分析:FreeCADGui模块 济南友泉软件有限公司 FreeCADGui项目实现了界面操作.模型显示与交互等相关功能,项目构建生成FreeCAD(_d).dll动态链接库. Fre ...

  4. Spring 源码分析(四) ——MVC(二)概述

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) from:Spring 源码分析(四) --MVC(二)概述 - 水门-kay的个人页面 - OSCHINA ...

  5. elasticsearch源码分析之search模块(server端)

    elasticsearch源码分析之search模块(server端) 继续接着上一篇的来说啊,当client端将search的请求发送到某一个node之后,剩下的事情就是server端来处理了,具体 ...

  6. live555 源码分析:RTSPServer 组件结构

    前面几篇文章分析了 live555 中 RTSP 的处理逻辑,RTSP 处理有关组件的处理逻辑有点复杂,本文就再来梳理一下它们之间的关系. live555 中 RTSP 处理有关组件关系如下图: 事件 ...

  7. 【投屏】Scrcpy源码分析四(最终章 - Server篇)

    Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...

  8. gSOAP 源码分析(四)

    gSOAP 源码分析(四) 2012-6-2 邵盛松 前言 本文主要说明gSOAP中对Client的认证分析 gSOAP中包含了HTTP基本认证,NTLM认证等,还可以自定义SOAP Heard实现认 ...

  9. Scrapy 源码分析之 RetryMiddleware 模块

    这是「进击的Coder」的第 689 篇技术分享 作者:TheWeiJun 来源:逆向与爬虫的故事 " 阅读本文大概需要 13 分钟. " 时隔一个多月,scrapy 章节又迎来了 ...

  10. ffplay源码分析4-音视频同步

    ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...

最新文章

  1. 使用List中的remove方法遇到的坑,不信你没有踩过!
  2. TTIC Postdoc Position
  3. .NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度...
  4. 谈谈Koa 中的next
  5. access在sql中横向求和_access在sql中横向求和_求和还用Sum函数就out了,快捷键Alt+=一秒搞定,操作简单更高效......
  6. mysql运用与实践_MySQL开发与实践 PDF 下载
  7. vector简单实现
  8. c++Insertion Sort插入排序的实现算法(附完整源码)
  9. 编程范式之命令式与函数式
  10. Linux管理员权限失败su Authentication failure
  11. 什么是去中心化?交易所为什么要去中心化?
  12. 【Vegas原创】ctrl shift无法切换输入法的解决方法
  13. cm10主题android l,索爱MK16i刷机包[Nightly 2013.03.18 CM10] Cyanogen团队定制
  14. 项目经理做项目的具体流程
  15. while循环结构的用法
  16. 那些年,从博客到出书的博主
  17. BIGEMAP下载等高线(高程)使用教程
  18. 基本运算符(逻辑运算)
  19. GBase产品学习-8a支持隐式转换
  20. 工程技术计算机,计算机工程技术-计算机科学

热门文章

  1. oracle 虚拟机安装mac os,【Mac OS X 详细安裝教程图解之虚拟机安装】-Oracle论坛-ZOL中关村在线...
  2. SAP ABAP内表OCCURS,WORK AREA等 语法对比!
  3. 【深度学习基础】Epoch, Batch, Iteration这三个概念的区别与联系
  4. 实现进程互斥需要遵循的原则
  5. 细数中国大学里的30个怪现状
  6. 如何避免淘宝拼多多比价订单?教你应对
  7. abaqus如何快速导入其他cae文件的assembly?
  8. orange's一个操作系统的实现--学习过程  第三章:a  为什么需要认识IA32架构IntelCPU保护模式
  9. win10打印机无法打印(怎样使用打印机打印)
  10. # 3 网页实现吃豆子动画