评论

收藏

[iOS开发] iOS WebRTC 点对点实时音视频流程介绍

移动开发 移动开发 发布于:2022-05-11 10:11 | 阅读数:353 | 评论:0

前言
公司某个项目需要接入音视频即时通讯, 功能类似微信的拨打视频通话,语音通话的场景。那么对于音视频通讯会用到什么技术呢?没错,它就是 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建立连接的过程
DSC0000.jpg

2.1这里介绍一下WebRTC三个核心组件

  • MediaStream:通过MediaStream的API能够通过设备的摄像头及话筒获得视频、音频的同步流
  • RTCPeerConnection:RTCPeerConnection是WebRTC用于构建点对点之间稳定、高效的流传输的组件
  • RTCDataChannel:RTCDataChannel使得浏览器之间(点对点)建立一个高吞吐量、低延时的信道,用于传输任意数据。
其中RTCPeerConnection是核心中的核心
2.2 WebRTC 连接的流程说明

  • 1.客户端通过socket or webSocket和服务器建立起TCP长链接, 这部分WebRTC并没有提供相应的API, 所以这里可以借助第三方框架。诸如: OC版本的SocketRocket, Swift版本的Starscream
    DSC0001.jpg
  • 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握手流程图:
DSC0002.jpg
发送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集成时遇到的问题总结 (声音默认输出由听筒改为扬声器、视频镜像、远端视频全屏等比填充等)

本文来自博客园,作者:reyzhang,转载请注明原文链接:https://www.cnblogs.com/reyzhang/p/16198182.html


   
   
   
                        

关注下面的标签,发现更多相似文章