若要在 Android 上实现一个 WebRTC 通话应用,需要通过 采集 - 渲染本地预览画面 - 创建连接 - 信令交换相关信息 - 渲染远端画面 这五步的工作。WebRTC 中为开发者做了一系列的封装,减轻了开发者开发一个通话应用的压力。本篇文章将通过介绍这五步的实现简单介绍一下基本的使用姿势。
准备工作
我们先要添加 WebRTC 依赖,在这篇文章中我们直接引用 WebRTC 官方编好的包即可,即直接在 build.gradle 中添加:
dependencies {
implementation 'org.webrtc:google-webrtc:1.0.+'
}
关于信令交换方式及信令服务器,不管是官方还是开源社区会有一大堆的开源项目,可以选择各种例如 WebSocket、XMPP 等方式进行信令通讯以交换相关信息创建连接。具体在此系列文章不进行叙述,可在文章末尾链接下载一整系列的代码(来自公司里我很敬佩的一位前辈)。
0、创建 PeerConnectionFactory
PeerConnectionFactory 是创建连接以及创建在连接中传输采集的音视频流数据的非常重要的一个类,且能在此处定义所使用的编解码器,本篇文章对编解码器不做深入描述,直接使用默认的 DefaultVideoEncoderFactory 和 DefaultVideoDecoderFactory。创建 PeerConnectionFactory 方式如下:
PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions.builder(context)
.setEnableInternalTracer(true)
.createInitializationOptions());
PeerConnectionFactory.Builder builder = PeerConnectionFactory.builder()
.setVideoEncoderFactory(encoderFactory)
.setVideoDecoderFactory(decoderFactory);
builder.setOptions(null);
mPeerConnectionFactory = builder.createPeerConnectionFactory();
1、采集
1.1、视频采集
一个视频通话需要进行视频采集和音频采集。做过 Android 相机应用开发的朋友都知道,Android 提供了一系列的上层相机操作接口,能够让我们很方便地去进行相机采集的操作,Android 在 API 21 时废弃了 Camera1 的接口推荐使用新的 Camera2,但是由于兼容问题几乎大多数开发者仍需要使用 Camera1,且要做使用 Camera1 还是 Camera2 的选择和适配。WebRTC 视频采集需要创建一个 VideoCapturer,WebRTC 提供了 CameraEnumerator 接口,分别有 Camera1Enumerator 和 Camera2Enumerator 两个实现,能够快速创建所需要的 VideoCapturer,通过 Camera2Enumerator.isSupported 判断是否支持 Camera2 来选择创建哪个 CameraEnumerator,选择好即可快速创建 VideoCapturer 了:
mVideoCapturer = cameraEnumerator.createCapturer(deviceName, null);
其中 deviceName 可通过 cameraEnumerator.getDeviceNames 获取,进而选择前置还是后置。然后我们创建一个 VideoSource 来拿到 VideoCapturer 采集的数据,并且创建在 WebRTC 的连接中能传输的 VideoTrack 数据:
VideoSource videoSource = mPeerConnectionFactory.createVideoSource(false);// 参数说明是否为屏幕录制采集
// 由于内部数据处理为 OpenGL 处理,则需要 EGL 环境相关的东西,本文不展开细讲
mSurfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", mRootEglBase.getEglBaseContext());
mVideoCapturer.initialize(mSurfaceTextureHelper, getApplicationContext(), videoSource.getCapturerObser