RTCPeerConnection 是WebRTC的核心的 是其暴露个用户的统一接口 其由多个模块组成
· 网络处理模块
· 服务质量模块
· 音视频引擎模块 等等
最最厉害的就是根据网络情况动态调整出音视频的最佳服务质量

创建RTCPeerConnection

配置ICE  也就是建立网络协商方式var pcConfig = {'iceServers': [{'urls': 'turn:xxx.fun:3478','credential': "root",'username': "root"}]
};pc = new RTCPeerConnection(pcConfig);

configuration 参数分析

bundlePolicy 指定如何绑定传输通道

banlanced:音频与视频轨使用各自的传输通道
max­compat:每个轨使用自己的传输通道
max­bundle:都绑定到同一个传输通道(主要使用)

iceTransportPolicy 指定ICE的传输策略

relay:只使用中继候选者 (测试时使用)
all:可以使用任何类型的候选者(一般使用)

iceServers 其由RTCIceServer组成,每个RTCIceServer都是一个ICE代理的服务器(如上demo)

credential 凭据,只有TURN服务使用
credentialType 凭据类型,可以password或oauth
urls 用于连接服中的ur数组
username 用户名,只有TURN服务使用

rtcpMuxPolicy rtcp的复用策略,该选项在收集ICE候选者时使用

negotiate 收集RTCP与RTP复用的ICE候选者,如果RTCP能复用就与RTP复用,如果不能复用,就将他们单独使用
require 只能收集RTCP与RTP复用的ICE候选者,如果RTCP不能复用,则失败(一般使用)

绑定本本地流

function bindTracks(){console.log('bind tracks into RTCPeerConnection!');if( pc === null || pc === undefined) {console.error('pc is null or undefined!');return;}if(localStream === null || localStream === undefined) {console.error('localstream is null or undefined!');return;}//add all track into peer connectionlocalStream.getTracks().forEach((track)=>{pc.addTrack(track, localStream);  });}function getMediaStream(stream){if(localStream){stream.getAudioTracks().forEach((track)=>{localStream.addTrack(track);  stream.removeTrack(track);});}else{localStream = stream;   }localVideo.srcObject = localStream;//这个函数的位置特别重要,//一定要放到getMediaStream之后再调用//否则就会出现绑定失败的情况conn();}

远端音视频渲染

每当远端的音视频数据传递过来的时候 RTCPeerConnection对象的Ontrack()事件就会触发
我们只需要给其设置一个回调函数即可

        pc = new RTCPeerConnection(pcConfig);pc.onicecandidate = (e)=>{if(e.candidate) {sendMessage(roomid, {type: 'candidate',label:event.candidate.sdpMLineIndex,id:event.candidate.sdpMid,candidate: event.candidate.candidate});}else{console.log('this is the end candidate');}}pc.ontrack = getRemoteStream;function getRemoteStream(e){remoteStream = e.streams[0];remoteVideo.srcObject = e.streams[0];
}

RTCPeerConnection基本概念 -- 以及创建和绑定音视频以及渲染远端视频时候的作用相关推荐

  1. SQL service基础(九)用户定义数据类型和用户定义函数的概念、创建及使用方法

    实验目标: 1.学习和掌握用户定义数据类型的概念.创建及使用方法. 2.学习和掌握用户定义函数的概念.创建及使用方法. 创建一个数据库,执行shiyan15.sql脚本 一.创建和使用用户定义的函数( ...

  2. python sip模块(为C和C++库创建Python绑定)

    Python的一个特性是,它具有强大的功能,它能够使用C或C++编写的现有库,并使它们成为Python扩展模块.这种扩展模块通常被称为库的绑定. SIP是一种工具,它可以很容易地为C和C++库创建Py ...

  3. SwiftUI之如何创建常量绑定与自定义绑定

    一.如何创建常量绑定? 当正在制作一些 UI 原型时,或者当只需要传入一个值来让 SwiftUI 预览显示一些有意义的东西时,可以会发现使用常量绑定很有帮助:硬编码的值不会改变,但可以仍然像常规绑定一 ...

  4. ROS基本概念 文件系统 创建ROS软件包 ROS中的一些命令

    ROS基本概念 文件系统 创建ROS软件包 ROS中的一些命令 ROS是什么 ROS文件系统 文件系统工具:rospack.roscd.rosls 创建ROS 软件包 catkin是什么 创建和构建一 ...

  5. Python数据分析实战【第三章】2.5-Pandas数据结构Dataframe:基本概念及创建【python】

    [课程2.5] Pandas数据结构Dataframe:基本概念及创建 "二维数组"Dataframe:是一个表格型的数据结构,包含一组有序的列,其列的值类型可以是数值.字符串.布 ...

  6. Ceph实战(五):Ceph的块设备基本概念,创建以及其特点(基于nautilus版本)

    您好,我是码农飞哥,本篇文章是Ceph实战专栏的第五篇文章,承接上文,默认我们已经将集群部署好了,本文主要讲述Ceph的块设备基本概念,创建以及其特点.订阅本专栏我会1V1的帮您解决部署和使用ceph ...

  7. iOS音视频开发七:视频采集

    将通过拆解采集 → 编码 → 封装 → 解封装 → 解码 → 渲染流程并实现 Demo 来向大家介绍如何在 iOS/Android 平台上手音视频开发. 这里是第七篇:iOS 视频采集 Demo.这个 ...

  8. 音视频流程 - 语音/短视频 :录制(编码)和播放(解码)

    -- 录制小视频: Camera -> YUV帧序列 -> YUV帧处理(镜像,缩放,旋转) -> 编码器  -> H264数据 大体上就是从摄像头输出的YUV帧经过预处理之后 ...

  9. cocos creator对接字节跳动(抖音)小游戏激励视频广告注意事项(审核不通过,次数不一致和重复获得奖励等)

    首先是官方文档里的对接方式:(https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/api/open-inter ...

最新文章

  1. 为什么 HashMap 的加载因子是0.75?
  2. Unsupported ONNX opset version: 11
  3. Qt中 QString 和int,double等的转换
  4. oracle中备份package源码
  5. python多级网址爬取_python-29:多级页面爬取源码
  6. quartus仿真系列2:74193功能
  7. “凸优化基础”相关理论知识
  8. ospf中DR/BDR选举及接口网络类型
  9. 上传图片报413错误
  10. Java实现微信公众号客服功能和本地联调
  11. 关于新光源中我想做的事
  12. android 图片叠加xml,Drawable子类之——LayerDrawable (图层叠加)
  13. Dispatch barriers处理读与写的冲突
  14. Bone-Age-Detection-From-X-Ray
  15. 使用高防CDN有什么用处?
  16. 计算机应用池在哪,机动车号牌发放将全国统一 号池号码全部由计算机随机投放、自动增补...
  17. 【经营智慧】002.赚钱主要靠知识和智慧
  18. RHCA第一天:环境搭建,访问命令行,简单命令
  19. 移动互联网——2011年最值得关注的100个应用程序(目录)
  20. 计算机大学生兼职项目的网站,大学生兼职信息分类网站的设计与实现(JSP,MySQL)(含录像)...

热门文章

  1. [csp2019]Emiya家今天的饭
  2. web渗透测试----12、HTTP主机标头漏洞
  3. killProcesses
  4. hge source explor 0x1
  5. SPARK-SQL 读取 内存table 或 hive中的table
  6. MySQL使用索引的正确方式你知道吗?
  7. 兼容ie(8、9、10、11),google等浏览器的多附件上传完整演示
  8. 浅析电力监控在新型数据中心的设计和应用-Susie 周
  9. Spring 5.0+Spring Boot+security+spring cloud oauth2+Redis整合详情,记录那些遇到的一些坑
  10. VCC、 VDD、VEE、VSS区别