参考自:
Introduction to WebRTC on Android
Android之WebRTC介绍html
WebRTC被誉为是web长期开源开发的一个新启元,是近年来web开发的最重要创新。WebRTC容许Web开发者在其web应用中添加视频聊天或者点对点数据传输,不须要复杂的代码或者昂贵的配置。目前支持Chrome、Firefox和Opera,后续会支持更多的浏览器,它有能力达到数十亿的设备。vue
然而,WebRTC一直被误解为仅适合于浏览器。事实上,WebRTC最重要的一个特征是容许本地和web应用间的互操做,不多有人使用到这个特性。html5
本文将探讨如何在本身的Android应用中植入WebRTC,使用 WebRTC Initiative 中提供的本地库。这边文章不会讲解如何使用信号机制创建通话,而是重点探讨Android与浏览器中实现的差别性和类似性。下文将讲解Android中实现对应功能的一些接口。若是想要了解WebRTC的基础知识,强烈推荐 Sam Dutton’s Getting started with WebRTC 。java
下面的讲解基于Android WebRTC库版本9127.android
首先要作的是在应用中添加WebRTC库。 WebRTC Initiative 提供了 一种简洁的方式来编译 ,但尽可能不要采用那种方式。取而代之,建议使用原始的io编译版本,能够从 maven central repository 中获取。ios
添加WebRTC到工程中,须要在你的依赖中添加以下内容:web
compile ‘io.pristine:libjingle:9127@aar’sql
同步工程后,WebRTC库就准备就绪。浏览器
同其余Android应用同样,使用某些 API 须要申请相应权限。WebRTC也不例外。制做的应用不一样,或者须要的功能不一样,例如音频或者视频,所须要的权限集也是不一样的。请确保按需申请!一个好的视频聊天应用权限集以下:服务器
在浏览器中使用WebRTC时,有一些功能完善、说明详细的API可供使用。 navigator.getUserMedia 和 RTCPeerConnection 包含了可能用到的几乎全部功能。结合 标签使用,能够显示任何想要显示的本地视频流和远程视频流。
所幸的是Android上也有相同的API,虽然它们的名字有所不一样。Android相关的API有 VideoCapturerAndroid , VideoRenderer , MediaStream , PeerConnection , 和 PeerConnectionFactory 。下面咱们将逐一讲解。
在开始以前,须要建立PeerConnectionFactory,这是Android上使用WebRTC最核心的API。
PeerConnectionFactory
Android WebRTC最核心的类。理解这个类并了解它如何建立其余任何事情是深刻了解Android中WebRTC的关键。它和咱们指望的方式仍是有所不一样的,因此咱们开始深刻挖掘它。
首先须要初始化PeerConnectionFactory,以下:
为了理解这个方法,须要了解每一个参数的意义:
若是一切ok,可使用PeerConnectionFactory 的构造函数建立本身的工厂,和其余类同样。
行动、获取媒体流、渲染
有了 peerConnectionFactory 实例,就能够从用户设备获取视频和音频,最终将其渲染到屏幕上。web中可使用 getUserMedia 和 。在Android中,没有这么简单,但能够有更多选择!在Android中,咱们须要了解VideoCapturerAndroid,VideoSource,VideoTrack和VideoRenderer,先从VideoCapturerAndroid开始。
VideoCapturerAndroid
VideoCapturerAndroid实际上是一系列Camera API的封装,为访问摄像头设备的流信息提供了方便。它容许获取多个摄像头设备信息,包括前置摄像头,或者后置摄像头。
有了包含摄像流信息的VideoCapturerAndroid实例,就能够建立从本地设备获取到的包含视频流信息的MediaStream,从而发送给另外一端。但作这些以前,咱们首先研究下如何将本身的视频显示到应用上面。
VideoSource/VideoTrack
从VideoCapturer实例中获取一些有用信息,或者要达到最终目标————为链接端获取合适的媒体流,或者仅仅是将它渲染给用户,咱们须要了解VideoSource 和 VideoTrack类。
VideoSource 容许方法开启、中止设备捕获视频。这在为了延长电池寿命而禁止视频捕获的状况下比较有用。
VideoTrack 是简单的添加VideoSource到MediaStream 对象的一个封装。
咱们经过代码看看它们是如何一块儿工做的。 capturer 是VideoCapturer的实例, videoConstraints 是MediaConstraints的实例。
AudioSource/AudioTrack
AudioSource 和 AudioTrack 与VideoSource和VideoTrack类似,只是不须要AudioCapturer 来获取麦克风, audioConstraints 是 MediaConstraints的一个实例。
VideoRenderer
经过在浏览器中使用WebRTC,你确定已经熟悉了使用 标签来显示出从 getUserMedia 方法获得的 MediaStream。但在本地Android中,没有相似 的标签。进入VideoRenderer,WebRTC库容许经过 VideoRenderer.Callbacks 实现本身的渲染。另外,它提供了一种很是好的默认方式VideoRendererGui。简而言之, VideoRendererGui 是一个 GLSurfaceView ,使用它能够绘制本身的视频流。咱们经过代码看一下它是如何工做的,以及如何添加renderer 到 VideoTrack。
这里要说明的一点是createGui 须要四个参数。这样作是使一个单一的GLSurfaceView 渲染全部视频成为可能。但在实际使用中咱们使用了多个GLSurfaceViews,这意味为了渲染正常,x、y一直是0。这让咱们了解到实现过程当中各个参数的意义。
MediaConstraints
MediaConstraints是支持不一样约束的WebRTC库方式的类,能够加载到MediaStream中的音频和视频轨道。具体参考 规范 查看支持列表。对于大多数须要MediaConstraints的方法,一个简单的MediaConstraints实例就能够作到。
要添加实际约束,能够定义 KeyValuePairs ,并将其推送到约束的 mandatory 或者 optional list。
MediaStream
如今能够在本地看见本身了,接下来就要想办法让对方看见本身。在web开发时,对 MediaStream 已经很熟悉了。 getUserMedia 直接返回MediaStream ,而后将其添加到RTCPeerConnection 传送给对方。在Android上此方法也是通用的,只是咱们须要本身建立MediaStream。 接下来咱们就研究如何添加本地的VideoTrack 和AudioTrack来建立一个合适的MediaStream。
Hi,有人在那里吗?
咱们如今有了包含视频流和音频流的MediaStream实例,并且在屏幕上显示了咱们漂亮的脸庞。如今就该把这些信息传送给对方了。这篇文章不会介绍如何创建本身的信号流,咱们直接介绍对应的API方法,以及它们如何与web关联的。 AppRTC 使用 autobahn 使得WebSocket链接到信号端。我建议下载下来这个项目来仔细研究下如何在Android中创建本身的信号流。
PeerConnection
如今咱们有了本身的MediaStream,就能够开始链接远端了。幸运的是这部分和web上的处理很类似,因此若是对浏览器中的WebRTC熟悉的话,这部分就至关简单了。建立PeerConnection很简单,只须要PeerConnectionFactory的协助便可。
参数的做用以下:
iceServers:链接到外部设备或者网络时须要用到这个参数。在这里添加STUN 和 TURN 服务器就容许进行链接,即便在网络条件不好的条件下。
constraints:MediaConstraints的一个实例,应该包含 offerToRecieveAudio 和 offerToRecieveVideo
observer:PeerConnectionObserver实现的一个实例。
PeerConnection 和web上的对应API很类似,包含了addStream、addIceCandidate、createOffer、createAnswer、getLocalDescription、setRemoteDescription 和其余相似方法。下载 WebRTC入门 来学习如何协调全部工做在两点之间创建起通信通道,或者 AppRTC 如何使得一个实时的功能完整的Android WebRTC应用工做的。咱们快速浏览一下这几个重要的方法,看它们是如何工做的。
addStream
这个是用来将MediaStream 添加到PeerConnection中的,如同它的命名同样。若是你想要对方看到你的视频、听到你的声音,就须要用到这个方法。
addIceCandidate
一旦内部IceFramework发现有candidates容许其余方链接你时,就会建立 IceCandidates 。当经过PeerConnectionObserver.onIceCandidate传递数据到对方时,须要经过任何一个你选择的信号通道获取到对方的IceCandidates。使用addIceCandidate 添加它们到PeerConnection,以便PeerConnection能够经过已有信息试图链接对方。
createOffer/createAnswer
这两个方法用于原始通话的创建。如你所知,在WebRTC中,已经有了caller和callee的概念,一个是呼叫,一个是应答。createOffer是caller使用的,它须要一个sdpObserver,它容许获取和传输会话描述协议Session Description Protocol (SDP)给对方,还须要一个MediaConstraint。一旦对方获得了这个请求,它将建立一个应答并将其传输给caller。SDP是用来给对方描述指望格式的数据(如video、formats、codecs、encryption、resolution、 size等)。一旦caller收到这个应答信息,双方就相互创建的通讯需求达成了一致,如视频、音频、解码器等。
setLocalDescription/setRemoteDescription
这个是用来设置createOffer和createAnswer产生的SDP数据的,包含从远端获取到的数据。它容许内部PeerConnection 配置连接以便一旦开始传输音频和视频就能够开始真正工做。
PeerConnectionObserver
这个接口提供了一种监测PeerConnection事件的方法,例如收到MediaStream时,或者发现iceCandidates 时,或者须要从新创建通信时。这些在功能上与web相对应,若是你学习过相关web开发理解这个不会很困难,或者学习 WebRTC入门 。这个接口必须被实现,以便你能够有效处理收到的事件,例如当对方变为可见时,向他们发送信号iceCandidates。
如上所述,若是你了解了如何与web相对应,Android上面的API是很是简单易懂的。有了以上这些工具,咱们就能够开发出一个WebRTC相关产品,当即部署到数十亿设备上。
WebRTC打开了人与人之间的通信,对开发者免费,对终端用户免费。 它不只仅提供了视频聊天,还有其余应用,好比健康服务、低延迟文件传输、种子下载、甚至游戏应用。
想要看到一个真正的WebRTC应用实例,请下载 Android 或 ios 版的appear.in。它在浏览器和本地应用间运行的至关完美,在同一个房间内最多能够8我的无偿使用。不须要安装和注册。
如今就发挥大家的潜力,开发出更多新的应用!