WebRTC源码分析四:视频模块结构

2023-11-01

转自http://blog.csdn.net/neustar1/article/details/19492113


本文在上篇的基础上介绍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类的某个方法后执行,所以使用回调。另外一方面为了可扩展,允许在现有的结构上实现更多功能。

        由于没带摄像头,需要调试一会,后续给出视频通信的代码示例。。。如果有不对的地方欢迎讨论,多多学习!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebRTC源码分析四:视频模块结构 的相关文章

  • coturn STUN 请求在本地工作,但不适用于远程连接

    我已成功向 coturn 服务器发出 TURN 请求 https github com coturn coturn https github com coturn coturn 但在执行 STUN 请求时失败 如果我尝试从运行服务器的同一台
  • 如何使用webrtc录制视频

    我需要在使用 Nodejs 构建的网站上使用笔记本电脑摄像头录制视频 为此 我使用 webRTC 到目前为止 我可以使用笔记本电脑摄像头拍照 但我需要录制视频 有人可以帮忙解释一下代码将如何进行吗 我当前的代码如下
  • org.webrtc.RTCPeerConnection 无法将视频发布到服务器

    我使用 webrtc 在会议中发送和获取视频 子主视频正常显示 但问题是视频没有发布到服务器 我检查方法 setlocalDescription 没有返回错误 这是我的sdp 有人可以帮忙吗 我搜索了很多解决方案 但我仍然不知道我的问题 我
  • iceConnectionState 已断开连接(通过互联网使用时)

    这个问题以前曾被问过 但我还没有找到答案 我基本上遇到了与描述相同的问题here https stackoverflow com questions 34405816 peerjs webrtc iceconnectionstate fai
  • WebRTC:对多个对等连接使用相同的 SDP?

    是否可以在多个对等连接中使用相同的 SDP 我正在使用 WebRTC 构建视频会议 这个想法是 呼叫者使用某种信令机制 使用其 SDP 每个用户相同的 SDP 向所有其他用户发送广播消息 然后用户将使用其 SDP 进行响应 当用户收到某人的
  • 如何与本机桌面 (win) 应用程序建立对等连接

    我需要与本机桌面 win 应用程序和网络浏览器建立对等连接 只是为了传输原始数据 从理论上讲 WebRTC 似乎是实现这一目标的唯一方法 如果您想使用 WebRTC 在浏览器和桌面之间交换数据 您可以使用此库将桌面部分编码为 C 语言 ht
  • 直接从冷启动弹出状态

    我建造了一个科尔多瓦app https play google com store apps details id com everycrave livewire使用离子框架 它是使用构建的Peer JS http peerjs com 每
  • 为 webRTC 使用特定端口

    当使用 webRTC 创建点对点音频连接时 如果用户位于路由器后面 我们使用的 STUN 服务器将返回公共 IP 现在在 ICE 对象中 我可以看到 rport 始终介于 50000 及以上 有没有办法使用特定端口 以便用户不必打开所有这些
  • iOS Webrtc - 捕获本地视频流时崩溃

    我正在尝试使用 Google 存储库中的 webrtc 库 我按照这些步骤创建了一个单独的项目 其中包含类似于 APPRTC 的说明和代码 并且我能够让它工作 我能够在两台设备之间进行会议 但是当我尝试与旧项目集成时 Webrtc 崩溃了
  • 在 Heroku 上部署 PeerJS 服务器

    我的 PeerJS 服务器有问题 我从这里使用了 部署到 Heroku 按钮 https github com peers peerjs server https github com peers peerjs server 我不知道如何连
  • 我们可以为 webrtc 视频设置的最小分辨率是多少?

    我正在使用 webrtc 测试一个点对点视频聊天应用程序 当我将视频限制设置为 var video constraints mandatory maxHeight 120 maxWidth 160 optional window navig
  • 未捕获的 ReferenceError:进程未定义简单对等 Javascript

    我目前正在学习 WebRTC 并使用 simple peer 和 React 和 Socket io 的 npm 包 当我尝试致电用户时 就会显示此错误 stream readable js 529 Uncaught ReferenceEr
  • 我可以在 DTLS-SRTP 加密中指定自己的加密密钥吗

    在 Chrome 中的 webrtc Web 应用程序中 我曾经通过覆盖 SDP 中的加密信息来指定自己的加密密钥 我现在正在迁移我的 webrtc Web 应用程序以使用 DTLS SRTP 进行加密 启用 DTLS 后 有没有办法告诉
  • 独立移动应用程序上的 WebRTC

    我知道WebRTC是为浏览器设计的 但是可以直接在移动应用程序上使用WebRTC库吗 Thanks 截至5月14日here https github com pchab AndroidRTC是一个android项目 使用WebRTC效果很好
  • 如何运行媒体流

    我创建了一个网络摄像头流 navigator getUserMedia video true function stream videoTag src window URL createObjectURL stream videoTag p
  • WebRTC 与 python

    我想用 python twisted 制作一个流服务器 它接收 WebRTC 视频流 然后对其应用一些 OpenCV 算法 但是我找不到 WebRTC 的 python 模块 如何使用 python twisted 发送和接收 WebRTC
  • 如何将音频从浏览器流式传输到 WebRTC 本机 C++ 应用程序

    到目前为止 我已成功运行以下示例 WebRTC 原生 C 到浏览器视频流示例 http sourcey com webrtc native to browser video streaming example 该示例展示了如何将视频从本机
  • 如何在 iOS 和 macOS 上的 Safari 中使用网络摄像头录制视频?

    我已经发布了几条路径 1 录制视频https caniuse com feat html media capture https caniuse com feat html media capture但它仅适用于 iOS 并且无法自定义 我
  • MediaStream 未处理的承诺拒绝:[object DOMError](在 Safari 11 中)

    在下面初始化 WebRTC 的方法中 我在 Safari Tech Preview 11 中遇到了未处理的承诺拒绝 具体来说 当我分配MediaStream像这样的视频元素 video srcObject event stream 堆栈跟踪
  • webrtc - 获取网络摄像头的宽高比

    我正在尝试学习如何开发 webRTC 应用程序 我想知道是否可以获得相机的宽高比 我不知道它是否有帮助 但我正在使用 webrtc io 但是 if更好 我可以停止使用它 From MDN https developer mozilla o

随机推荐

  • uLua中遇到的问题

    1 C 调用lua函数参数为空的问题 在C 中调用以 定义的函数传参时 self被第一个参数覆盖 而obj将为空 MessagePanel function MessagePanel Test1 obj lua调用正常 obj为传入参数 s
  • 上银伺服驱动器接线图_FRLS10205A4C上银伺服电机HIWIN D2-1023-P-C0 FRMS7520508C MD-36-S2...

    mega fabe成都上银伺服驱动器维修MD 18 DFRLS10205A4C上银伺服电机HIWIN D2 1023 P C0 FRMS7520508C MD 36 S2 能够发挥最大效能 ST系列电机SD300 310 系列 SD系列交流
  • pluto实现分析(19)

    本文档的Copyleft归yfydz所有 使用GPL发布 可以自由拷贝 转载 转载时请保持文档的完整性 严禁用于任何商业用途 msn yfydz no1 hotmail com 来源 http yfydz cublog cn 15 快速模式
  • 华为OD机试真题- 喊7的次数重排-2023年OD统一考试(B卷)

    题目描述 喊7是一个传统的聚会游戏 N个人围成一圈 按顺时针从1到N编号 编号为1的人从1开始喊数 下一个人喊的数字为上一个人的数字加1 但是当将要喊出来的数字是7的倍数或者数字本身含有7的话 不能把这个数字直接喊出来 而是要喊 过 假定玩
  • python怎么产生随机浮点数_python3生成随机数的几种常用方法

    前言 python中生成随机数主要用到random模块 方法主要包括 randint uniform random sample choice等几种常用方法 本篇教程就来说说这几种方法的使用方式 以及唯一流水号 时间戳 和验证码的实例展示
  • 高德地图的逆地理编码

    在一些比赛中 我们经常需要将地理位置转化为经纬度坐标 地理编码 或是将经纬度坐标转化为对应的地理位置 逆地理编码 对于这类问题 一般需要调用某个地图的API来实现 这里以高德地图的API为例 介绍如何实现逆地理编码 第一步 在高德地图API
  • ogre引擎0.12.0抄写记录

    惊喜地发现 文档齐全 可以参考类图抄 C Users Legion Desktop ogre v0 12 0 ogrenew Docs api html hierarchy html 先进行 1 OgreMain 然后 2 RenderSy
  • django实现文件上传

    在django中实现文件上传有三种方法可以实现 自己手动写 使用Form组件 使用ModelForm组件 其中使用ModelForm组件实现是最简单的 1 自己手写 先写一个上传的页面 upload file html enctype mu
  • 【大电流H桥电机驱动电路的设计与解析(包括自举电路的讲解,以IR2104+LR7843为例)】

    一 简介 之前介绍过H桥电机驱动电路的基本原理 但是以集成的电机驱动芯片为示例 这些集成的芯片使用起来比较简单 但是只能适用于一些小电流电机 对于大电流的电机 比如 RS380和RS540电机 则不能使用这些集成的芯片 否则会导致芯片严重发
  • vue component使用,动态加载子组件,调用子组件方法

    1 vue component使用 component组件 单独拿出一个组件来专门进行切换使用 官方文档 https cn vuejs org v2 guide components html 动态组件 https cn vuejs org
  • GCN为什么是半监督学习?

    因为GCN那篇论文里面 数据集的划分是一部分有标签 一部分没标签 但是在使用图的连接信息的时候用到了图的邻接矩阵 所有这部分是用到了全部图的结构信息 而有一部分节点没有标签 所以作者才把论文名字命名为半监督学习
  • 5.1声道测试音乐_5分钟让你搞懂单声道和立体声的真正区别!

    大家好 我是音乐人顾颂 从今天开始 我将不定期的通过图文的方式向大家介绍一些关于音乐方面的一些小知识 希望在此和你共同探讨 共同进步 第二篇 单声道与立体声 当我们通过音频播放设备收听声音的时候 我们的大脑会根据左右耳接受到了声音信号的差异
  • 制造业数字化转型存在哪些问题

    数字时代 制造业数字化转型不再是一道 选择题 而是 必答题 但各地政府以及企业正面临 对颠覆程度认识不足 对变革速度心存侥幸 对投入成本估计过高 三个方面的问题 一是对制造业数字化的颠覆程度认识不足 数字化变革推动下 制造业产品的价值来源正
  • android 系统级应用和服务的启动流程

    activityManagerService java 1 systemRaady 收到systemReady 通知 2 AppGlobals getPackageManager getPersistentApplications STOC
  • Android 一个类搞定软键盘弹起手下监听

    内容来自https www jianshu com p 56b91640aa10 监听很灵敏 一 使用 new SoftKeyBroadManager linearLayout addSoftKeyboardStateListener ne
  • 十、Java中的数组

    数组 Array 计算机专业的小伙伴对这个词都不陌生 不是计算机专业的小伙伴也不用怕书源会为大家介绍清楚数组 Array 这个概念 1 数组是数据结构的一种 那么什么是数据结构呢 简单理解数据结构就是带有结构特性的数据元素的集合 2 那么回
  • 学习python: 模块的建立与发布

    简单的说 一个python文件就是一个模块 本文主要介绍以下3点 模块的建立及导入 包的建立及导入 发布和安装自定义模块 模块的建立及导入 我们在写c 或者c 时候 为了复用代码 总是将一系列相关的函数写在一个 c文件中 或者封装一个类写在
  • 微软 Windows 10 删除文件“您需要来自 Trustedinstaller 的权限”解决方法

    问题描述 在删除 Windows 10 文件 例如 WINDOWS BT 时弹出文件夹访问被拒绝 你需要来自 Trustedinstaller 的权限才能对此文件夹进行更改 操作步骤 1 右键文件夹 选择 属性 2 选择 安全 3 选择 高
  • [P3074

    题目描述 Farmer John s N cows 1 lt N lt 10 000 are conveniently numbered 1 N Each cow i takes T i units of time to milk Unfo
  • WebRTC源码分析四:视频模块结构

    转自 http blog csdn net neustar1 article details 19492113 本文在上篇的基础上介绍WebRTC视频部分的模块结构 以进一步了解其实现框架 只有了解了整体框架结构 对局部算法修改才能够胸有成