iOS WebRTC 点对点实时音视频流程介绍
前言
公司某个项目需要接入音视频即时通讯, 功能类似微信的拨打视频通话,语音通话的场景。那么对于音视频通讯会用到什么技术呢?没错,它就是 WebRTC
。
什么是WebRTC
WebRTC,名称源自网页实时通信(Web Real-Time Communication
)的缩写,简而言之它是一个支持网页浏览器
进行实时
语音对话或视频对话的技术。
它为我们提供了视频会议
的核心技术,包括音视频的采集
、编解码
、网络传输
、显示
等功能,并且还支持跨平台
:windows,linux,mac,android,iOS。
它在2011年5月开放了工程的源代码,在行业内得到了广泛的支持和应用,成为下一代视频通话的标准
。
iOS端 WebRTC的使用
1. 了解构建一个音视频通讯的结构
一个完整的音视频通讯结构包括两部分: Server
服务器端, Client
客户端
- Server端:
Stun
服务器 : 服务器用于获取设备的外部网络地址
Turn
服务器 : 服务器是在点对点失败后用于通信中继
信令
服务器 : 负责端到端的连接。两端在连接之初,需要交换信令,如sdp、candidate等,都是通过信令服务器 进行转发交换的。 - Client有四大应用端:
Android、 iOS、 PC、 Broswer
2. 了解WebRTC建立连接的过程
2.1这里介绍一下WebRTC三个核心组件
MediaStream
:通过MediaStream的API能够通过设备的摄像头及话筒获得视频、音频的同步流RTCPeerConnection
:RTCPeerConnection是WebRTC用于构建点对点之间稳定、高效的流传输的组件RTCDataChannel
:RTCDataChannel使得浏览器之间(点对点)建立一个高吞吐量、低延时的信道,用于传输任意数据。
其中RTCPeerConnection
是核心中的核心
2.2 WebRTC 连接的流程说明
1.客户端通过
socket
orwebSocket
和服务器建立起TCP长链接, 这部分WebRTC并没有提供相应的API, 所以这里可以借助第三方框架。诸如: OC版本的SocketRocket, Swift版本的Starscream
2.客户端通过信令服务器, 进行
offer
SDP
握手
SDP(Session Description Protocol)
:描述建立音视频连接的一些属性,如音频的编码格式、视频的编码格式、是否接收/发送音视频等等
SDP 是通过webrtc框架里面的PeerConnection
所创建, 详细创建请参考我的demo.
- 3.客户端通过信令服务器, 进行
Candidate
握手
Candidate
:主要包含了相关方的IP信息,包括自身局域网的ip
、公网ip
、turn服务器ip
、stun服务器ip
等
Candidate 是通过webrtc框架里面的PeerConnection
所创建, 详细创建请参考我的demo.
- 4.客户端在
SDP
和Candidate
握手成功后, 就建立起一个P2P
端对端的链接, 视频流就能直接传输, 不需要经过服务器啦.
3.了解SDP握手流程和Candidate握手流程
SDP
握手流程和Candidate
握手流程类似, 但有点繁琐, 下面就SDP握手流程简要说明:
下图为WebRTC通过信令建立一个SDP握手的过程。只有通过SDP握手,双方才知道对方的信息,这是建立p2p
通道的基础。
P2P
SDP握手流程图:
发送offer
过程:
1.A端通过
RTCPeerConnection
的createOffer
生成 SDP 描述
2.A端再通过调用RTCPeerConnection
的setLocalDescription
,设置本地的描述信息
3.A端通过信令
将offer SDP
发送给B端
4.B端通过信令
接收到A端发送过来的offer SDP, 并调用RTCPeerConnection
的setRemoteDescription
,设置远端的描述信息
发送answer
过程:
5.B端通过
RTCPeerConnection
的createAnswer
创建出自己的 SDP 描述
6.B端再通过RTCPeerConnection
的setLocalDescription
,设置本地的描述信息
7.B端通过信令
将anwser SDP
发送给A端
8.A端通过信令
接收到B端发送过来的answer SDP, 并调用RTCPeerConnection
的setRemoteDescription
,设置远端的描述信息。
9.通过SDP握手后,两端之间就会建立起一个端对端的直接通讯通道。
由于我们所处的网络环境错综复杂,用户可能处在私有内网内,使用p2p
传输时,将会遇到NAT以及防火墙等阻碍。这个时候我们就需要在SDP握手
时,通过STUN/TURN/ICE
相关NAT穿透技术
来保障p2p
链接的建立。
集成时遇到的问题
详见:
iOS WebRTC集成时遇到的问题总结 (声音默认输出由听筒改为扬声器、视频镜像、远端视频全屏等比填充等)
iOS WebRTC 点对点实时音视频流程介绍的更多相关文章
- 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化
本文原文由声网WebRTC技术专家毛玉杰分享. 1.前言 有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据.就在去年(2017年),WebR ...
- 实时音视频互动系列(下):基于 WebRTC 技术的实战解析
在 WebRTC 项目中,又拍云团队做到了覆盖系统全局,保证项目进程流畅.这牵涉到主要三大块技术点: 网络端.服务端的开发和传输算法 WebRTC 协议中牵扯到服务端的应用协议和信令服务 客户端iOS ...
- 从零到一,使用实时音视频 SDK 一起开发一款 Zoom 吧
zoom(zoom.us) 是一款受到广泛使用的在线会议软件.相信各位一定在办公.会议.聊天等各种场景下体验或者使用过,作为一款成熟的商业软件,zoom 提供了稳定的实时音视频通话质量,以及白板.聊天 ...
- 实时音视频互动系列(上):又拍云UTUN网络详解
如何定义实时音视频互动, 延迟 400ms 内才能无异步感 实时音视频互动如果存在1秒左右的延时会给交流者带来异步感,必须将视频播放延迟限制在400ms以内,才能给用户较好的交互体验. 当延迟控制在4 ...
- 融云携新版实时音视频亮相 LiveVideoStack 2019
4 月 19 日,LiveVideoStack 2019 音视频大会在上海隆重开幕,全球多媒体创新专家.音视频技术工程师.产品负责人.高端行业用户等共襄盛会,聚焦音频.视频.图像.AI 等技术的最新探 ...
- 小程序升级实时音视频录制及播放能力,开放 Wi-Fi、NFC(HCE) 等硬件连接功能
“ 小程序升级实时音视频录制及播放能力,开放 Wi-Fi.NFC(HCE) 等硬件连接功能.同时提供按需加载.自定义组件和更多访问层级等新特性,增强了第三方平台的能力,以满足日趋丰富的业务需求.” 0 ...
- BBR在实时音视频领域的应用
小议BBR算法 BBR全称Bottleneck Bandwidth and RTT,它是谷歌在2016年推出的全新的网络拥塞控制算法.要说明BBR算法,就不能不提TCP拥塞算法. 传统的TCP拥塞控制 ...
- 腾讯互动白板+即时通讯+实时音视频,Android学生端接入
腾讯互动白板+即时通讯+实时音视频,Android学生端接入 一.简介 线上教学方案:腾讯云互动白板(Tencent Interactive Whiteboard,TIW)+即时通信(Instant ...
- 微信小程序+腾讯云直播的实时音视频实战笔记
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
随机推荐
- 纯css就能实现可点击切换的轮播图,feel起来很丝滑
前言 轮播图经常会在项目里用到,但是实际上用到的轮播图都是比较简单的,没有复杂的特效,这个时候如果去引入swiper那些库的话,未免就有点杀鸡焉用牛刀了. 所以不如自己手写一个,而今天我要分享的一种写 ...
- ssh隧道连接的方式连接数据库
最好用xshell做隧道连接,其他工具没接触过过 1.先新建一个会话 2.点进刚刚建好的连接,右击属性 3.点进隧道,添加,输入映射到本地的配置 4.完成之后用数据库连接工具连接即可 参考连接: ht ...
- 30.Mysql主从复制、读写分离
Mysql主从复制.读写分离 目录 Mysql主从复制.读写分离 读写分离 读写分离概述 为什么要读写分离 什么时候要读写分离 主从复制与读写分离 mysql支持的复制类型 主从复制的工作过程 初始环 ...
- 解决nginx反向代理Mixed Content和Blockable问题
nginx配置https反向代理,按F12发现js等文件出现Mixed Content,Optionally-blockable 和 Blockable HTTPS 网页中加载的 HTTP 资源被称之 ...
- Python-基础知识汇集
1.列表 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可 代码理解:列表 ...
- Flink1.13.1源码解析-Application on yarn(一)
本篇文章讲述 Flink Application On Yarn 提交模式下,从命令提交到 AM 容器创建 1.脚本入口 flink run-application -t yarn-applicati ...
- 图片管够!用Python做了个图片识别系统(附源码)
本项目将使用python3去识别图片是否为色情图片,会使用到PIL这个图像处理库,并且编写算法来划分图像的皮肤区域 介绍一下PIL: PIL(Python Image Library)是一种免费的图像 ...
- 利用MATLAB仿真最小发射功率下WSN的连通性和覆盖率
一.目的 (1)在固定节点个数的前提下,仿真求得使网络保持连通的最小通信半径(最低能级). (2)在上述节点个数和通信半径的前提下,计算随机布撒的节点的覆盖率. 二.方法描述 (1)首先假设通信半径都 ...
- 使用APICloud开发app录音功能
mp3Recorder模块封装在iOS.Android下录音直接生成mp3,统一两个平台的录音生成文件,方便双平台之间的交互,减少录音完成后再转码的过程:同时提供分贝波形图显示UI:使用该模块前需 ...
- Ubuntu安装python各版本
编译安装的话,之前遇到过很多小问题,感觉还是通过添加这个ppa方式装的比较稳,缺点是可能安装的比较慢,可配合proxychain4 sudo apt install software-properti ...