Open rainzhaojy opened 7 years ago
搭建一个简单的WebRTC应用并不难, 这里有一个简单的例子: WebRTC simple demo
但是要构建一个高可用的WebRTC应用其实是非常困难的, 你需要解决这些问题:
本文主要探讨第一个问题,即客户端实现的问题:一个音视频应用,需要在各种平台上工作,那么基于WebRTC开发音视频应用时就需要考虑在各种平台上如何实现WebRTC,从2个维度来看这个问题:
2个维度相互组合后可以有很多种做法,本文会简单介绍一些。
关于browser的支持情况:
下面是browser对于WebRTC支持情况的简要介绍:
支持WebRTC, 实现的功能最多, 某个参数格式和方法行为可能与spec有一些区别, 这可以通过adapter.js来隐藏这些不同.
Chrome 52+开始支持H264 (OpenH264 for encoding and FFmpeg for decoding)
Chromebook与Chrome共享相同代码,因此对于WebRTC的支持情况类似,区别是Chromebook上会使用hardware encoder/decoder.
支持WebRTC, 功能比Chrome略少, 但各种接口更符合spec. FF39+开始相关接口更符合规范.
关于Firefox的支持情况, 可以参考:
支持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 11开始支持WebRTC: https://webkit.org/blog/7726/announcing-webrtc-and-media-capture/
不支持, 将来也不会支持, 如果你需要支持IE, 需要考虑plugin方案. 这里有一些介绍
2016/11的Kranky Geek WebRTC Event讨论了mobile WebRTC开发.
开发mobile应用一般有3种做法: web application, hybrid, native. 另外还有微信平台。
对于mobile browser而言, iOS11之前所有browser都不支持WebRTC, iOS11开始safari支持WebRTC, 其他浏览器还不支持, android上的chrome/firefox支持WebRTC, 但需要留意的是, 在很多手机上chrome并不是default browser (很多手机厂商都有自己定制版的default browser), 因此这一方式不推荐.
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应用而言还不成熟。
WebRTC native code本身是一个cross-platform open source project, 为了充分利用mobile资源, 一般来说, 在mobile上开发WebRTC都是以native的方式实现的.
微信小程序开放了音视频的能力,可以比较方便的实现推流和拉流,这一能力本身是为直播提供的,但结合推流和拉流也可以实现实时音视频通话。
需要注意的是,微信自己推流使用了QUIC协议,但是第三方使用的话是RTMP over TCP的,因此时延会有一点大。
如果基于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/
如果你有自己的native client,并要实现音视频应用,可以采用类似mobile native方案,将WebRTC native code直接集成到你的client里。
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音视频应用.
搭建一个简单的WebRTC应用并不难, 这里有一个简单的例子: WebRTC simple demo
但是要构建一个高可用的WebRTC应用其实是非常困难的, 你需要解决这些问题:
本文主要探讨第一个问题,即客户端实现的问题:一个音视频应用,需要在各种平台上工作,那么基于WebRTC开发音视频应用时就需要考虑在各种平台上如何实现WebRTC,从2个维度来看这个问题:
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音视频应用.