webrtc

AppRTC-Android 源码导读

2019-02-18  本文已影响5人  C_GO流媒体后台开发

源地址:AppRTC-Android 源码导读
注:本博主有修改

WebRTC 的安卓 demo 工程—— AppRTC-Android 的源码导读

概览

让我们先搞清楚 WebRTC 的几个核心类以及它们之间的关系,首先是三大核心类

MediaStream 中包含多个 Track(AudioTrack,VideoTrack),用于采集数据,PeerConnection 则包含多个 Stream。【本地数据叫采集,是 Stream 的事,那远端的数据呢?在本地也是一个 Stream 吗?】而数据则通过 DataChannel 收发。【音视频数据也通过 DataChannel 收发?】

WebRTC 的代码量不小,一次性看明白不太现实,在本文中,我将试图搞清楚三个问题:

  1. 客户端之间如何建立连接?
  2. 客户端之间如何协商音视频相关的配置?
  3. 音视频数据的采集、预览、编码、传输、解码、渲染完整流程。

当然,限于篇幅和实际需求,细节之处我不会展开,但把握住了主线之后,日后再有具体需求,我们就可以快速找到相关代码了。

建立连接

连接的建立涉及到roomserver和signal server。

下面是一张简单的示意图(懒得画高大上的流程图了):


下面是创建者关键的代码位置:

涉及到 sdp 之后,就从 app 进入到 WebRTC 的库里面了。
创建 offer 在库里面的调用流程:

接下来是加入者关键代码的位置:

接下来是创建者收到 answer 之后的处理流程:

上面 setLocalDescription/setRemoteDescription 有一段较长的调用链,它们会分别回调到 onCreateSuccess/onSetSuccess。

【ICE candidate 怎么生成的?怎么使用的?添加 ICE candidate 会开始建立 P2P 连接?】这块没有太大的需求,先不看了... (P2P是内部进行?)

SDP

这块没有太大的需求,先不看了...

音视频全流程

我们先看视频流程,WebRTC 支持多种数据源,Camera1、Camera2、录屏,我们以 Camera1 采集为例,整个流程包括以下环节:

相机到预览

我们可以采取两头夹逼的方式来探究,采集是 Camera1,那就是 Camera1Capturer,预览则是 SurfaceViewRenderer,整个数据流动的关键环节如下:

而这个数据流的各个环节是怎么一步步建立起来的呢?就在创建 PeerConnection 的过程中:PeerConnectionClient#createPeerConnectionInternal,其中调用了 PeerConnectionClient#createVideoTrack,创建好了 VideoTrack,这一数据流就建立起来了:

至此,视频数据从相机到预览的流动过程就已经清晰了,而这个流程是怎么建立起来的,应该也已经很清楚了。

这里有一个 NDK 开发的技巧,对于 Java 对象把调用转发到 native 层的场景,我们需要把 Java 对象和 native 对象关联起来,通常做法是把 native 对象的指针作为 Java 对象的一个 long 类型的 nativeHandle 成员,native 函数都传入这个 handle,这样就可以调用 native 对象的方法了。

最后,如果你想看图,下面是手写的调用步骤 :)

【图一】

【图二】

相机到编码

剥离 WebRTC 采集、预览、编码

上一篇下一篇

猜你喜欢

热点阅读