WebRTC 各端的互联互通

WebRTC 各端的互联互通

  • WebRTC 各端的互联互通
    • WebRTC Native 的核心
    • 一对一通信的时序图
      • 发起通话
      • 接收通话
      • 关闭通话
    • Android 端的实现
    • iOS 端的实现
    • 各开发方案的比较
    • 参考

WebRTC 各端的互联互通

WebRTC Native 的核心

正如 WebRTC Web 端的核心是 RTCPeerConnection,WebRTC Native 的核心对象是 PeerConnectionFactory。可以通过它创建 Track、MediaStream、PeerConnection 等对象,还可以通过它指定音视频的编解码器、设置编解码器的参数、开启回声消除等功能,甚至为 WebRTC 指定工作线程、信号线程等。

但从功能上讲,PeerConnectionFactory 还是无法与 RTCPeerConnection 相比,它们最大的不同是,RTCPeerConnection 可以传输数据,而 PeerConnectionFactory 不行。RTCPeerConnection 所做的事情需要由 PeerConnectionFactory 和 PeerConnection 对象加在一起才能完成。

WebRTC Native 处理流程:

在这里插入图片描述

那么通过PeerConnection对象建立音视频通话,包括如下步骤:

  1. 创建PeerConnectionFactory,通过工厂方法webrtc::CreatePeerConnectionFactory。
  2. 创建PeerConnection,通过它的PeerConnectionFactory的CreatePeerConnection方法。
  3. 调用PeerConnectionFactory的CreateAudioTrack和CreateVideoTrack方法创建Track。
  4. 调用PeerConncetion的 AddTrack方法添加Track,track最终会反映到sdp中的m行中。协商成功的Track在随后会通过onAddTrack回调告知应用层,根据Track的类型来确定是回放视频还是音频。
  5. 如果是本地为发起端则需调用PeerConnection的CreateOffer方法,产生本地SDP信息(抽象为webrtc::SessionDescriptionInterface对象),触发CreateSessionDescriptionObserver中OnSuccess方法,在OnSuccess方法中调用PeerConnection的SetLocalDescription方法,获取sdp字符串后通过信令协议给到远端。
  6. 如果远端是发起,在收到信令服务传来的远端SDP消息,调用PeerConnection的SetRemoteDescription方法(需将sdp字符转换为webrtc::SessionDescriptionInterface对象)。然后调用PeerConnection的CreateAnswer方法(产生的local sdp应该还是会通过CreateSessionDescriptionObserver的OnSuccess回调给出,最终还是通过PeerConnection的SetLocalDescription方法设置)。

整个过程本质就是获取本地SDP信息和远端SDP信息,再进行协商,流程可以概括为如下图。

在这里插入图片描述

上述流程都是异步,所以会有状态回调来告知应用状态。主要的两个Observer就是CreateSessionDescriptionObserver和PeerConnectionObserver,前者是告知sdp创建,协商的状态。后者是PC对象的状态。

在这里插入图片描述

Conductor类在examples/peerconnection/client/conductor.h,是webrtc native的pc对象封装示例代码。实现一个pc client,可以参照它的实现,首先是要继承CreateSessionDescriptionObserver和PeerConnectionObserver,再是有PeerConnectionInterface(PC对象)和PeerConnectionFactoryInterface(用于创建PC对象)的成员变量。

一对一通信的时序图

发起通话

在这里插入图片描述

接收通话

在这里插入图片描述

关闭通话

在这里插入图片描述

Android 端的实现

在 Android 端,我们将按以下几个步骤实现 WebRTC 一对一通信:

  1. 申请权限
  2. 引入 WebRTC 库
  3. 构造 PeerConnectionFactory
  4. 创建音视频源
  5. 视频采集
  6. 视频渲染
  7. 创建 PeerConnection
  8. 建立信令系统

各个步骤的详细说明见于:WebRTC 在 Android 端实现一对一通信。

iOS 端的实现

在 iOS 端,我们将按以下几个步骤实现 WebRTC 一对一通信:

  1. 申请权限
  2. 引入 WebRTC 库
  3. 构造 PeerConnectionFactory
  4. 创建音视频源
  5. 视频采集
  6. 本地视频预览
  7. 建立信令系统
  8. 创建 RTCPeerConnection
  9. 远端视频渲染

各个步骤的详细说明见于:WebRTC 在 iOS 端实现一对一通信。

各开发方案的比较

  1. Native 方案:通过底层 API 实现。开发出的应用程序执行效率高,占用空间小,可做深度定制化开发。劣势是开发成本高,且需要针对 Windows 和 Mac 系统编写两天代码。
  2. Electron 方案:基于 Chrome 浏览器内核。开发语言是 JS,只需要编写一套代码就可以在各个终端上运行,且效果一致。
  3. Flutter 方案:由 Google 推出,适用于各类型终端,执行效率与 Native 类似。

参考

  1. https://blog.csdn.net/mo4776/article/details/136061794
  2. https://webrtc.github.io/webrtc-org/native-code/native-apis/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/666755.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自适应全屏滚动,实现swiper 全屏滚动效果与解决bug

原来是想复刻明日方舟的滚动代码,基于此进行开发 js实现网页全屏切换(平滑过渡),鼠标滚动切换_网页滚动条下滑和全屏切换是什么-CSDN博客 但是发现bug BUG 原因是只获取了一次高度 于是增加窗口监听, 但是发现拉伸…

C语言王国——杨氏矩阵

目录 1. 引言 2. 了解杨氏矩阵 3. 思路分析 4. 代码 5. 总结 1. 引言 最近在做二维数组的训练的时候发现了一个很有意思的题: 一看这不是杨氏矩阵嘛,接下来就由姜糖我带大家了解一下这个著名的矩阵。 2. 了解杨氏矩阵 通过查阅百度得知: …

电脑如何开启硬件虚拟化?这 2 种方法都可以使用

开启硬件虚拟化的方法 我们应该如何开启硬件虚拟化呢?下面就为大家总结了 2 种开启电脑硬件虚拟化的方法。 WinRE 启用 我们可以通过 Windows 恢复环境也就是 WinRE 在UEFI 或者 BIOS 上开启硬件虚拟化,大家可以按照下面的步骤进行操作。 首先打开设…

【Python】解决Python报错:AttributeError: ‘int‘ object has no attribute ‘xxx‘

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

Prometheus + Grafana + Alertmanager 系统监控

PrometheusGrafana 系统监控 1. 简介1.1 Prometheus 普罗 米修斯1.2 Grafana 2. 快速试用2.1 Prometheus 普罗 米修斯2.2 Prometheus 配置文件2.3 Grafana 2. 使用 Docker-Compose脚本部署监控服务3. Grafana 配置3.1 配置数据源 Prometheus3.2 使用模板ID 配置监控模板3.3 使用…

SpringBoot 单元测试 指定 环境

如上图所示,在配置窗口中添加--spring.profiles.activedev,就可以了。

【算法实战】每日一题:在后面的位置找到比当前元素第一个大的元素(非暴力,单调栈)

1. 数据结构-单调栈 单调栈是一种特殊的栈结构,它只允许栈内的元素保持单调性(单调递增或单调递减)。在实际应用中,单调栈常用于解决与单调性相关的算法问题,如找到下一个比当前元素大(或小)的…

与牢霍沟通——Linux操作系统原理

硬件层 计算机由何组成? 我们现在手中的计算机,无论配置如何,是笔记本还是台式,都由三部分构成: 输入设备:键盘,鼠标...中央处理器:cpu,显卡,磁盘...输出设…

在鲲鹏服务器上安装nginx

华为鲲鹏服务器采用华为自研cpu ARMv8架构,提供 Windows 和多个Linux 系统 常使用 CentOS 7.6 64bit with ARM Nginx 和 Apache 一样都是一种 Web 服务器。是基于 REST 架构风格,以统一资源描述符URI 或者统一资源定位符URL 作为沟通依据,通过 HTTP 协议…

Flink系列二:DataStream API中的Source,Transformation,Sink详解(^_^)

在上面篇文章中已经对flink进行了简单的介绍以及了解了Flink API 层级划分,这一章内容我们主要介绍DataStream API 流程图解: 一、DataStream API Source Flink 在流处理和批处理上的 source 大概有 4 类: (1)基于本…

【深度学习】安全帽检测,目标检测,yolov10算法,yolov10训练

文章目录 一、数据集二、yolov10介绍三、数据voc转换为yolo四、训练五、验证六、数据、模型、训练后的所有文件 寻求帮助请看这里: https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tabBB08J2一、数据集 安全帽佩戴检测 数据集:https://github.com/njvi…

匿名函数(lambda)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 匿名函数是指没有名字的函数,应用在需要一个函数,但是又不想费神去命名这个函数的场合。通常情况下,这样的函数只…

VRTK4.0学习——(二)

手柄绑定以及显示 1.导入CameraRigs.UnityXRPluginFramework 和 CameraRigs.TrackedAlias 预设,将CameraRigs.UnityXRPluginFramework拖入CameraRigs.TrackedAlias的Elements中即可,运行软件后即可看到手柄了 注:如果无法看到手柄&#xff…

鹤城杯 2021 流量分析

看分组也知道考http流量 是布尔盲注 过滤器筛选http流量 将流量包过滤分离 http tshark -r timu.pcapng -Y "http" -T json > 1.json这个时候取 http.request.uri 进一步分离 http.request.uri字段是我们需要的数据 tshark -r timu.pcapng -Y "http&quo…

fmql之CAN调试

刚刚把zynq的CAN调成功。那么现在就要把程序移植到fmql了。 老规矩,Procise导入vivado的.bd和.xci文件。 Procise下create block也可以,但是不能自动约束引脚,只能手动写代码。 PeripheralTest CanExample中用到了CAN0和CAN1:…

重生之 SpringBoot3 入门保姆级学习(11、日志的进阶使用)

重生之 SpringBoot3 入门保姆级学习(11、日志的进阶使用) 3.2.4 文件输出3.2.5 日志文档的归档与切割 3.2.4 文件输出 配置 application.properties # 日志文件名 如果不写路径默认就是在项目根路径建立 demo.log 文件 推荐写法 D:\\demo.log 路径 文…

虚拟机Ubuntu 22.04上搭建GitLab操作步骤

GitLab是仓库管理系统,使用Git作为代码管理工具。GitLab提供了多个版本,包括社区版(Community Edition)和企业版(Enterprise Edition)。实际应用场景中要求CPU最小4核、内存最小8GB,非虚拟环境。 以下是在虚拟机中安装社区版步骤:…

R语言ggplot2包绘制高端堆积柱状图

数据和代码获取:请查看主页个人信息!!! 关键词“高端堆积柱状图” 大家好,今天我将介绍如何使用ggplot2包绘制高端堆积柱状图。 本次绘图灵感来源于下面这篇文章,之所以复现这张图,有这么几个原…

查看docker中各个容器所占的资源

要查看Docker中的每个容器占用的资源,可以使用docker stats命令。这个命令提供了容器的实时资源使用统计,包括内存使用情况。以下是如何使用docker stats命令的示例: docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsa…

Nginx企业级负载均衡:技术详解系列(14)—— 账户认证功能

你好,我是赵兴晨,97年文科程序员。 你有没有听说过Nginx的账户认证功能?这可不只是一个技术问题,它关系到我们上网时的安全和便利。就像家里需要一把钥匙才能进们一样,Nginx的账户认证功能就是确保有只有授权的人才能…