来分享一下 Android 音视频之视频采集(系统 API 预览)的完整攻略。
一、什么是视频采集?
视频采集是将外部环境中的视频信号转换成数字信号的过程,是实现视频录制、视频直播等功能必备的第一步。
二、Android 系统 API 预览实现视频采集
1. 相机设备
Android 的视频采集可通过相机设备实现。要获取相机设备,需要使用 Camera API 或 Camera2 API,其中 Camera2 API 的相机架构与 Camera API 相比,拥有更先进、更灵活的功能,建议优先使用 Camera2 API。
2. 相机预览
要进行视频采集,需要首先进行视频预览。使用 SurfaceView 对象可以实现相机预览:
// 获取 Camera2Manager 实例
mCamera2Manager = new Camera2Manager(context);
// 获取相机预览的 SurfaceView
mPreviewView = findViewById(R.id.preview_view);
// 配置预览 Surface
mCamera2Manager.setPreviewSurface(mPreviewView.getHolder().getSurface());
// 开启相机预览
mCamera2Manager.startPreview();
3. 相机采集
获取到相机预览后,就可以进行视频采集了。通过设置 Camera2 API 的 CaptureRequest.Builder 对象实现:
// 配置视频采集的目标 Surface
mCamera2Manager.setRecordSurface(mMediaRecorder.getSurface());
// 创建视频捕捉请求构建器
mPreviewBuilder = mCamera2Manager.createPreviewBuilder();
// 设置视频的捕捉请求参数
mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO);
// 设置预览 Surface 和采集 Surface
mPreviewBuilder.addTarget(mPreviewView.getHolder().getSurface());
mPreviewBuilder.addTarget(mMediaRecorder.getSurface());
4. 相机拍照
除了视频采集,Android 相机 API 还支持拍照功能。通过设置 CaptureRequest.Builder 对象实现:
// 创建拍照请求构建器
mCaptureBuilder = mCamera2Manager.createCaptureBuilder(CameraDevice.TEMPLATE_STILL_CAPTURE);
// 获取拍照的目标 Surface
mCaptureBuilder.addTarget(mImageReader.getSurface());
// 设置拍照的捕捉参数
mCaptureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
mCaptureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
mCaptureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 提交拍照请求
mCamera2Manager.capture(mCaptureBuilder.build(), new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
// 拍照完成回调
}
}, null);
三、示例说明
1. 实现相机预览
在布局文件中添加 SurfaceView 控件:
<SurfaceView
android:id="@+id/preview_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
在 Activity 中实现相机预览:
private Camera2Manager mCamera2Manager;
private SurfaceView mPreviewView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPreviewView = findViewById(R.id.preview_view);
// 获取 Camera2Manager 实例
mCamera2Manager = new Camera2Manager(this);
// 配置预览 Surface
mCamera2Manager.setPreviewSurface(mPreviewView.getHolder().getSurface());
// 开启相机预览
mCamera2Manager.startPreview();
}
2. 视频采集和录制
在 Activity 中实现视频采集和录制:
private Camera2Manager mCamera2Manager;
private MediaRecorder mMediaRecorder;
private SurfaceView mPreviewView;
private CaptureRequest.Builder mPreviewBuilder;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPreviewView = findViewById(R.id.preview_view);
// 获取 Camera2Manager 实例
mCamera2Manager = new Camera2Manager(this);
// 初始化 MediaRecorder 对象
mMediaRecorder = new MediaRecorder();
// 设置 MediaRecorder 音频和视频源
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
// 设置 MediaRecorder 输出格式、编码器、比特率等参数
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setVideoEncodingBitRate(10 * 1024 * 1024);
mMediaRecorder.setVideoFrameRate(30);
mMediaRecorder.setVideoSize(1920, 1080);
mMediaRecorder.setOutputFile("path/to/video.mp4");
// 配置 MediaRecorder 的预览和录制 Surface
mMediaRecorder.setPreviewDisplay(mPreviewView.getHolder().getSurface());
// 配置视频采集的目标 Surface
mCamera2Manager.setRecordSurface(mMediaRecorder.getSurface());
// 创建视频捕捉请求构建器
mPreviewBuilder = mCamera2Manager.createPreviewBuilder();
// 设置视频的捕捉请求参数
mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO);
// 设置预览 Surface 和采集 Surface
mPreviewBuilder.addTarget(mPreviewView.getHolder().getSurface());
mPreviewBuilder.addTarget(mMediaRecorder.getSurface());
// 开始录制
mMediaRecorder.prepare();
mMediaRecorder.start();
// 开始采集
mCamera2Manager.startRecord(mPreviewBuilder.build(), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
try {
// 提交预览请求
session.setRepeatingRequest(mPreviewBuilder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
}
}, null);
}
四、总结
以上就是 Android 音视频之视频采集(系统 API 预览)的完整攻略及示例说明。视频采集是 Android 音视频功能的核心之一,需要开发者结合实际需求进行深入学习和实践。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android音视频之视频采集(系统API预览) - Python技术站