WebRTC源码初探之Android平台视频采集

WebRTC的采集模块中提供了多个平台的音视频采集实现,这里我们针对Android平台来分析一下WebRTC的采集模块。

在讲解之前有几个概念需要明白

  • Source: 在WebRTC中将一切数据的来源都抽象成一个Source
  • Track: 在WebRTC中一个Track代表一路音频或视频,一个Track需要通过一个Source来创建
  • Sink: 在WebRTC中将数据的消费都抽象成一个Sink,将一个Sink添加到一个Track上,就可以收到对应Source的数据

VideoCapturer

VideoCapturer是设备采集模块对外提供的控制接口,通过CameraEnumerator来创建。

通过CameraEnumerator可以检测当前设备上Camera设备的支持情况,然后通过createCapturer函数可以开启指定Camera设备进行采集,VideoCapturer对采集提供一些逻辑控制。

1
2
3
4
5
6
private static VideoCapturer createVideoCapturer(Context context) {
CameraEnumerator enumerator = Camera2Enumerator.isSupported(context)
? new Camera2Enumerator(context)
: new Camera1Enumerator();
return enumerator.createCapturer(enumerator.getDeviceNames()[0], null /* eventsHandler */);
}

CameraEnumerator

CameraEnumerator负责提供对Camera设备信息的获取、以及负责创建CameraCapturer,具体实现有Camera1Enumerator和Camera2Enumerator。

CameraCapturer

CameraCapturer是对采集操作的封装,对外提供了开始采集、结束采集、设置采集参数等接口,负责创建CameraSession,对CameraSession的功能进行接口封装。CameraCapturer的具体实现有Camera1Capturer和Camera2Capturer。

CameraSession

CameraSession是对AndroidCameraApi的包装,具体实现有Camera1Session和Camera2Session。

数据类型

CameraApi支持两种类型的数据回调,一种是字节流,另一种是纹理。这两种类型适合不同的场景,字节流类型对于FFmpeg等软编码比较方便,但是如果想要使用OpenGL-ES来对数据进行处理,那么就需要将字节流转换成纹理才行;纹理类型对OpenGL-ES处理比较方便,但是只有MediaCodec才支持纹理的编码,如果想要使用FFmpeg软编码,需要将纹理数据提取成字节流。

Camera1Session两种类型的数据都支持,通过参数captureToTexture来控制返回的数据类型。

1
2
3
public Camera1Enumerator(boolean captureToTexture) {
this.captureToTexture = captureToTexture;
}

Camera2Session只支持纹理类型的数据返回,并没有实现Camera2的字节流数据返回。(Camera2可以通过ImageReader获取字节流,但是硬件兼容性太差,不同厂商实现不一致)

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×