WebRTC原理与web端实战开发

什么是WebRTC

webRtc(web real-time Communication) ,旨在建立一个浏览器间实时通信的平台

  • 谷歌开源
  • 跨平台(android,IOS,windows,Linux)
  • 实时传输(提供强大的音视频引擎)

RTC涉及的流程及内容

采集->编码->传输->解码->渲染

采集:捕获摄像头、麦克风设备数据(yuv,pcm)

编码:将yuv、pcm格式数据编码(h264、vp8、opus、aac)

传输:将编码后的桢数据打包传输,应对弱网环境(QOS),RTP/RTCP协议传输数据

解码:将编码后的数据解码成yuv/pcm数据

渲染:将解码后的数据展示到渲染窗口

WebRTC架构

架构说明:

your web app:是你的应用程序通过Web Api方式实现的音视频程序。

Web Api: 在C++的API层封装了一次WebAPI 的WEBRTC接口给上层应用调用。

WEBRTC C++ API:暴露C++封装的WEBRTC真实实现。

Session Manager:会话层,用于接收会话信息和结束会话信息。

Voice Engine:音频引擎编解码。

Video Engine:视频引擎编解码

Transport:数据传输引擎。

WebRTC通信流程图

描述:

1.客户端A要与客户端B通信,需要连接信令服务。

2.客户端A要与客户端B通信,需要连接STUN/TURN服务器做NAT转发IP转换。

3.客户端A要与客户端B通信,需要通过信令服务将两者NAT转发IP做交换。

4.两者媒体协商成功,就可以音视频通信。

WebRTC API 枚举音视频设备

//功能说明:枚举音视频设备
//返回说明:描述设备的MediaDeviceInfo数组
var promise= navigator.mediaDevices.enumerateDevices();
//示例文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices
//注意事项:
// 1.如果需要获取音视频枚举必须给浏览器设备允许获取音频或视频设备信息。
// 2.如果项目发布到互联网中需要使用HTTPS协议

WebRTC API 采集音视频设备数据

//功能说明:采集音视频设备数据
//参数说明:paramters
var promise = navigator.mediaDevices.getUserMedia(constaints);
//示例文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
//注意事项:获取音视频数据需要用<video></video><audio></audio>标签播放

WebRTC API 采集桌面窗口数据

//功能说明:采集桌面数据
//参数说明:paramters
var promise= navigator.mediaDevices.getDisplayMedia(constaints);
//示例文档:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getDisplayMedia

WebRTC API 适配

  • WebRTC标准推出之前,各大浏览器厂商使用自己对WebRTC规范支持API不一致
  • 例如:
    • 谷歌:webkitGetUserMedia
    • 火狐:mozGetUserMedia
  • 如果用户自行编写适配不同浏览器的应用层程序,如下所示
    • var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
  • 兼容不同浏览器API的适配程序
  • <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

MediaStream

播放音视频返回的是MediaStream对象,MediaStream用于表示媒体内容,它包含了一系列音视频轨道(MediaStream API)

构造方式:getUserMedia / getDisplayMedia / new MediaStream();

主要方法:

MediaStream.addTrack();

MediaStream.getTrack() / MediaStream.getAudioTracks() / MediaStream.getVideoTracks()

MediaStreamTrack

MediaStreamTrack表示一个具体的音视频轨道,例如音频轨道,适配轨道

重要数据:

MediaStreamTrack.id

MediaStreamTrack.kind

MediaStreamTrack.label

重要方法:

MediaStreamTrack.getConstraints() 获取轨道约束

MediaStreamTrack.getSettings() 获取轨道当前设置属性


RTCPeerConnection

概念:RTCPeerConnection 用于表示一个与远程的对等连接

构造方式:var pc = new RTCPeerConnection([configuration])

媒体协商的主要方式:

AddTrack:将音视频轨道添加到RTCPeerConnection,这些轨道将发送到对端

createOffer / createAnswer: 生成offer /answer SDP信息

setLocalDescription/setRemoteDescription :将SDP描述信息设置RTCPeerConnection 的本地/远程描述信息

媒体协商

问题:什么是媒体协商,为什么要进行媒体协商?媒体协商包含了哪些信息?

Amy和Bob要进行音视频通话

Amy采集摄像头/麦克风数据,进行编码,打包,然后通过网络输出Bob

Bob接收媒体包数据后需要组桢,解码,渲染

双方需要协商使用的编解码器,编解码器的具体参数,通过包含了哪些媒体信息,媒体怎么区分等

媒体协商流程

WebRTC 网络穿越

思考:两个WebRTC客户端怎么实现端到端通讯?

  • 场景1:客户端A和客户端B都处于公网
  • 场景2:客户端A和客户端B有一方处于公网,另外一方处于内外(NAT之后)
  • 场景3:客户端A和客户端B处于内外
    • A:同一内部网络
    • B:不同内部网络

NAT(NETWORK Address Translator)

什么是NAT?

网络地址转换,负责将内外地址转换公网地址的互相转换

为什么需要NAT?

IPV4地址不够

网络安全考虑

NAT类型

P2P穿越

 

 

 

使用coturn搭建STUN/TURN服务器

sudo apt-get update
sudo apt-get install coturn

#修改/etc/turnserver.conf文件的配置,如下
listening-port=3478
external-ip=公网服务器外网ip
lt-cred-mech
user=username1:password1
realm=mycompany.org

#启动
turnserver-c /etc/turnserver.conf

https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

ICE

ICE:交互式连接建立(Interactive Connectivity Establishment)

1.收集候选地址

2.交互候选项

3.STUN 连接检查

4.选定地址并启动媒体

5.KeepAlive

收集候选地址既收集本端或许可用于接收媒体以建立起对等连接的IP地址和端口



候选地址分类:

1.主机候选者(host):网卡的实际地址

2.服务器反射候选者(srflx):STUN服务器恢复STUN binding success response 中的反射地址,最后外层NAT的地址

3.中续候选者(relay):请求turn服务器的中续地址

4.对端反射候选者(prflx):从对端发送的STUN binding request中获取传输地址,本端无法收集到该类型候选地址。

RTCPeerConnection收集并交换候选者

RTCPeerConnection收集并交换候选者
事件: icecandidate
发生时机: RTCPeerConnection调用setLocalDescription之后
处理方式: rtcPeerConnection.onicecandidate =(event)=>{
if(event.candidate){
//将本地候选者发送给对端
}else {
//表示在本地协商中没有更多的候选者了

}

https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/icecandidate_event

RTCPeerConnection收集并交换候选者


接收到对端候选者后的处理方式addlcecandidate
语法: addlceCandidate(candidate)
参数: candidate 类型是RTCIceCandidatelnit,包含 candidate, sdpMid, sdpMLinelndex, usernameFragment 成
https://developer.mozillaorg/en-US/docs/Web/API/RTCIceCandidate/RTCIceCandidate

RTCPeerConnection ontrack

事件:ontrack
发生时机:收到对端的媒体轨道
处理方式:将MediaStreamTrack添加到MediaStream,将MediaStream赋值给<video>展示出对端的媒体画面
var remoteMs =new MediaStream();
rtcPeerConnection.ontrack =(event)=> (
       remoteMs.addTrack(event.track);
        videoElement.srcObiect =remotes

}

RTCPeerConnection构造参数说明明

构造方式: 
var pc= new RTCPeerConnection([configuration]);
interface RTCConfiguration {
bundlePolicy?:RTCBundlePolicy;
certificates?:RTCCertificatell;
iceCandidatePoolSize?:number;
iceServers?:RTCIceServerl];
iceTransportPolicy?:RTCIceTransportPolicy;rtcpMuxPolicy?:RTCRtcpMuxPolicy;

https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection

信令服务器

 

本文福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

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

相关文章

SpringCloud(H版alibaba)框架开发教程---附源码 一

源码地址&#xff1a;https://gitee.com/jackXUYY/springboot-example 创建订单服务&#xff0c;支付服务&#xff0c;公共api服务&#xff08;共用的实体&#xff09;&#xff0c;eureka服务 1.cloud-consumer-order80 2.cloud-provider-payment8001 3.cloud-api-commons 4.…

Vue框架引入Axios

首先已经创建好了 Vue 框架&#xff0c;安装好了 node.js。 没有完成的可按照此博客搭建&#xff1a;搭建Vue项目 之后打开终端&#xff0c;使用命令。 1、命令安装 axios 和 vue-axios npm install axios --save npm install vue-axios --save2、package.json 查看版本 在 p…

Flink1.17实战教程(第五篇:状态管理)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

新建虚拟环境并与Jupyter内核连接

第一步:在cmd里新建虚拟环境,shap38是新建的虚拟环境的名字 ,python=3.x conda create -n shap38 python=3.8第二步,安装ipykernel,打开anconda powershell prompt: 虚拟环境的文件夹位置,我的如图所示: 进入文件夹并复制地址: 输入复制的文件夹地址更改文件夹:…

跨境电商获客脚本必备功能有哪些?

随着全球化的加速和电子商务的兴起&#xff0c;跨境电商已经成为了企业拓展市场、提高收益的重要途径。 而在跨境电商运营中&#xff0c;获客脚本的作用不可忽视&#xff0c;本文将为您揭示跨境电商获客脚本必备的五大功能&#xff0c;帮助您在激烈的市场竞争中抢占先机。 一…

基于零和收益的DEA模型研究python实现

传统的DEA模型往往假设相关的是相互独立的,此时DEA模型只能计算出相对效率,无法进行效率的调整。如在碳排放分配问题上,碳排放总量保持不变,利用DEA模型只能计算出每个省份分配的相对效率,这在讨论固定资源下的碳排放配额分配问题时具有明显的局限性。在这种情况下,利用Z…

网络拓扑图怎么画最好?

画拓扑图的方式有很多&#xff0c;在线软件&#xff0c;Visio&#xff0c;PPT&#xff0c;都是方法。 问题是你要怎么从0到1&#xff0c;怎么样用拓扑图完美地把你的网络逻辑结构、思路呈现出来。 没经验的朋友真的不知道从哪里上手。 今天就给你来一篇绘制拓扑图详解&#…

Mybatis-plus实际开发步骤

一、Mybatis-plus基本配置 1、pom.xml导入Mybatis-plus依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version> </dependency>2、application.yml文…

Local Binary Convolutional Neural Networks (LBCNN)

论文&#xff1a;https://arxiv.org/abs/1608.06049 代码&#xff1a;GitHub - juefeix/lbcnn.torch: Torch implementation of CVPR17 - Local Binary Convolutional Neural Networks http://xujuefei.com/lbcnn.html 摘要&#xff1a; 我们提出了局部二值卷积(LBC)&#x…

【Redis】八、哨兵模式

文章目录 一、概述这里的哨兵有两个作用多个哨兵 二、哨兵测试1、配置哨兵配置文件 sentinel.conf2、启动哨兵3、断开Master节点 三、哨兵模式优点&#xff1a;缺点&#xff1a; 哨兵模式的全部配置 参考&#xff1a;狂神说Java bilibili哨兵模式 一、概述 自动选取老大的模式…

WEB渗透—PHP反序列化(九)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

C语言停车场模型详解

C语言停车场模型详解 1. 引言2. 代码概述3. 代码详解3.1 定义常量和数据结构3.2 初始化车库3.3 查找车辆所在车库3.4 查找车辆所在的车位3.5 打印车库状态3.6 打印等候车辆3.7 车辆入库3.8 车辆出库3.9 菜单功能3.10 主函数 5.效果展示5.完整代码6. 总结 1. 引言 本文将介绍一…

linux 网络工具(二)

linux 网络工具 1. ip命令簇4.1 address4.2 link4.3 route4.4 rule 2. 其他常用命令2.1 ifup/ifdown2.2 配置主机名2.3 设置DNS服务器指向2.4 配置域名解析2.5 ss2.6 路由相关配置文件2.7 查看机器可用端口2.8 traceroute2.9 dhclient 1. ip命令簇 Linux的ip命令和ifconfig类似…

vue3+elementPlus:el-drawer新增修改弹窗复用

在el-drawer的属性里设置:title属性&#xff0c;和重置函数 //html<!-- 弹窗 --><el-drawerv-model"drawer":title"title":size"505":direction"direction":before-close"handleClose"><el-formlabel-posit…

yolov8 细胞分割数据集准备及训练

1、数据 下载:https://universe.roboflow.com/motherson-hm/5-part-diff 500来张,5个类别(嗜碱性细胞、嗜酸细胞、淋巴细胞、单核细胞、中性粒细胞) yolo 分割数据标注格式: 与检测类似,就是坐标分割有多个 2、训练 训练yaml: seg_data.yaml (与检测格式一样) …

Guava自加载缓存LoadingCache使用指南

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天我们来聊聊缓存。在Java世界里&#xff0c;高效的缓存机制对于提升应用性能、降低数据库负担至关重要。想象一下&#xff0c;如果每次数据请求都要跑到数据库里取&#xff0c;那服务器岂不是要累趴了&#x…

SpringBoot发布项目到docker

Dockerfile FROM openjdk:11 # 作者 MAINTAINER chenxiaodong<2774398338qq.com># 安装 vim # RUN yum -y install vim# 环境变量 # 进入容器后的默认工作目录 ENV WORKPATH /usr/local/webapp ENV EXECFILE Docker2Application-0.0.1-SNAPSHOT.jarRUN mkdir -p $WORKPA…

论文分享 | 利用单模态自监督学习实现多模态AVSR

以下文章来源于智能语音新青年 &#xff0c;作者ttslr 论文地址&#xff1a; https://aclanthology.org/2022.acl-long.308.pdf 代码仓库&#xff1a; https://github.com/LUMIA-Group/Leveraging-Self-Supervised-Learning-for-AVSR 训练一个基于Transformer的模型需要大量的…

从0开始学前端day1

script setup 在script里写一个setup的作用 自动注册子组件属性和方法无需返回&#xff0c;执行完后自动更新支持props和context Vue 3中的props和context props是一种用于父子组件通信的机制。父组件可以通过props向子组件传递数据&#xff0c;子组件则可以通过props接收来…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图&#xff1a; CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…