音视频采集
在整个音视频处理的过程中,位于发送端的音视频采集工作无疑是整个音视频链路的开始。在 Android 或者 IOS 上都有相关的硬件设备——Camera 和麦克风作为输入源。本章我们来分析如何在 Android 上通过 Camera 以及录音设备采集数据。
Camera
在 Android 上的图片/视频采集设备无疑就是 Camera 了,在 Android SDK API21 之前的版本只能使用 Camera1 ,在 API 21 之后 Camera1 已经被标记为 Deprecated ,Google 推荐使用 Camera2,下面我们来分别看一下。
Camera1
我们先来看一下 Camera1 体系的部分类图。
Camera 类是 Camera1 体系的核心类,该类还有好多内部类,如上图:
Camera.CameraInfo 类表达 Camera 的前后(facing)和旋转(orientation)等 Camera 相关的信息。
Camera.Parameters 类是 Camera 相关的参数设置比如设置预览 Size 以及设置旋转角度等。
Camera 类拥有打开 Camera、设置参数、设置预览等 API,下面我们来看使用 Camera API 打开系统照相机的流程。
1.在开启 Camera 之前先释放 Camera,这一步的目的是重置 Camera 的状态重置 Camera 的 previewCallback 为 null
调用 Camera 的 release 释放
把 Camera 对象设置为 null
/**
*释放Camera
*/
private fun releaseCamera() {
//重置previewCallback为空
cameraInstance!!.setPreviewCallback(null)
cameraInstance!!.release()
cameraInstance = null
}
2.获取 Camera 的 Id
/**
*获取Camera Id
*/
private fun getCurrentCameraId(): Int {
val cameraInfo = Camera.CameraInfo()
//遍历所有的Camera id,比较CameraInfo facing
for (id in 0 until Camera.getNumberOfCameras()) {
Camera.getCameraInfo(id, cameraInfo)
if (cameraInfo.facing == cameraFacing) {
return id
}
}
return 0
}
3.打开 Camera 获取 Camera 对象
/**
*获取Camera 实例
*/
private fun getCameraInstance(id: Int): Camera {
return try {
//调用Camera的open函数获取Camera的实例
Camera.open(id)
} catch (e: Exception) {
throw IllegalAccessError("Camera not found")
}
}
4.设置 Camera 的相关参数
//[3]设置参数
val parameters = cameraInstance!!.parameters
if (parameters.supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
parameters.focusMode = Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE
}
cameraInstance!!.parameters = parameters
5.设置 previewDisplay
//【4】 调用Camera API 设置预览Surface
surfaceHolder?.let { cameraInstance!!.setPreviewDisplay(it) }
6.设置预