rainzhaojy / blogs

200 stars 28 forks source link

WebRTC在各种平台上(Browser,Mobile,Native)的实现方案 #3

Open rainzhaojy opened 7 years ago

rainzhaojy commented 7 years ago

搭建一个简单的WebRTC应用并不难, 这里有一个简单的例子: WebRTC simple demo

但是要构建一个高可用的WebRTC应用其实是非常困难的, 你需要解决这些问题:

  1. 各种平台上如何实现WebRTC,browser方案还是native方案?
  2. P2P打洞技术与高可靠的网络连接,如何穿越NAT和Firewall,建立快速可靠的网络连接?
  3. QoS与Congestion Control,如何解决网络拥塞与丢包问题,如何在任何网络环境下都能提供可接受的音视频服务?
  4. 如何解决跨网、跨地区的接入问题,如何实现就近接入和智能路由?
  5. 如何选择conference的方案?MESH,SFU,MCU?
  6. 等等

本文主要探讨第一个问题,即客户端实现的问题:一个音视频应用,需要在各种平台上工作,那么基于WebRTC开发音视频应用时就需要考虑在各种平台上如何实现WebRTC,从2个维度来看这个问题:

  1. 不同平台(Windows, Mac, iOS, Android, Linux)
  2. 不同方案(Browser,Native,Hybrid)

2个维度相互组合后可以有很多种做法,本文会简单介绍一些。

1. Desktop Browser对于WebRTC的支持情况

关于browser的支持情况:

下面是browser对于WebRTC支持情况的简要介绍:

Chrome

支持WebRTC, 实现的功能最多, 某个参数格式和方法行为可能与spec有一些区别, 这可以通过adapter.js来隐藏这些不同.

Chrome 52+开始支持H264 (OpenH264 for encoding and FFmpeg for decoding)

Chromebook

Chromebook与Chrome共享相同代码,因此对于WebRTC的支持情况类似,区别是Chromebook上会使用hardware encoder/decoder.

Firefox

支持WebRTC, 功能比Chrome略少, 但各种接口更符合spec. FF39+开始相关接口更符合规范.

关于Firefox的支持情况, 可以参考:

MS Edge

支持ORTC, Object RTC和WebRTC接口有很多不同, 但接口区别不是问题, 一者WebRTC里也吸纳了很多ORTC的接口, 二者可以通过adapter.js来隐藏这些不同.

但是早期的Edge支持X-H264UC, 与标准的H264并不兼容, 如果video要实现和Chrome/Firefox互联互通的话, 需要在Server端做transcoding.

17年1月消息, Edge支持H264/AVC了, 可以与Chrome/Firefox互通了: Introducing WebRTC 1.0 and interoperable real-time communications in Microsoft Edge, 目前还是Beta, 应该会在2017Q2 release.

18年12月消息,Edge会使用Chrome内核了.

Safari

Safari 11开始支持WebRTC: https://webkit.org/blog/7726/announcing-webrtc-and-media-capture/

IE

不支持, 将来也不会支持, 如果你需要支持IE, 需要考虑plugin方案. 这里有一些介绍

2. Mobile平台如何支持WebRTC?

2016/11的Kranky Geek WebRTC Event讨论了mobile WebRTC开发.

开发mobile应用一般有3种做法: web application, hybrid, native. 另外还有微信平台。

Web Application

对于mobile browser而言, iOS11之前所有browser都不支持WebRTC, iOS11开始safari支持WebRTC, 其他浏览器还不支持, android上的chrome/firefox支持WebRTC, 但需要留意的是, 在很多手机上chrome并不是default browser (很多手机厂商都有自己定制版的default browser), 因此这一方式不推荐.

Hybrid

Hybrid的目的是既利用mobile平台原生的一些功能(位置,指纹识别,原生UI等),又能使用同一套代码实现跨平台开发,一般有两种做法,一是使用Cordova/PhoneGap这类JavaScript in webview的方案,另一种是使用React Native这类JavaScript to native的方案。Android 4.4 以前 webview 是基于 webkit ,4.4 及以后采用 chromium,可以支持webrtc,iOS11虽然已经支持webrtc,但webview还是一个低版本的内核,不支持webrtc。

对于某些应用来说,Hybrid可能是个好选择,但对于WebRTC应用而言还不成熟。

Native

WebRTC native code本身是一个cross-platform open source project, 为了充分利用mobile资源, 一般来说, 在mobile上开发WebRTC都是以native的方式实现的.

微信小程序

微信小程序开放了音视频的能力,可以比较方便的实现推流和拉流,这一能力本身是为直播提供的,但结合推流和拉流也可以实现实时音视频通话。

需要注意的是,微信自己推流使用了QUIC协议,但是第三方使用的话是RTMP over TCP的,因此时延会有一点大。

3. H5 (用于微信分享等)

如果基于WebRTC来实现H5音视频方案,需要考虑如下场景:

iOS端:safari 11支持WebRTC, 但是webview里的浏览器内核是safari 8,不支持WebRTC,因此需要提示用户打开系统safari浏览器,即需要跳出微信、支付宝等app。

Android端:

因此在安卓端,比较可靠的做法是使用VP8/9,这样不用跳出微信、支付宝等app,用户体验较好,各种手机基本也都支持,只是为了与iOS等互通,需要在服务器端进行VP8/9与H264之间转码。

另外一个做法就是不使用WebRTC,采用类似zoom的做法:https://webrtchacks.com/zoom-avoids-using-webrtc/

4. Desktop Native方案

如果你有自己的native client,并要实现音视频应用,可以采用类似mobile native方案,将WebRTC native code直接集成到你的client里。

5. UWP Native方案

MS最近开源了UWP native方案: Real-Time Communications on the Universal Windows Platform with WebRTC and ORTC, 源代码位于GitHub, 这样可以使用C#/C++在Xbox/HoloLens/Surface Hub/Windows Phone等Windows10平台上等开发native音视频应用.