在Android中,音视频采集主要涉及到使用Intent结合系统自带的相机和麦克风应用,或者使用Camera2 API和MediaRecorder类进行更高级的控制。以下是一些基本的步骤和示例代码,帮助你实现音视频采集功能。
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.microphone" android:required="true" />
Intent cameraIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
Intent audioIntent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
if (cameraIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(cameraIntent, REQUEST_VIDEO_CAPTURE);
}
if (audioIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(audioIntent, REQUEST_AUDIO_CAPTURE);
}
注意:这种方式比较原始,可能需要处理多个Intent的返回结果,并且相机和麦克风的控制有限。
这种方式的优点是你可以更灵活地控制相机和麦克风的行为,但实现起来相对复杂。
private void createPreviewSession() {
try {
// 获取CameraManager
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
// 获取Camera ID
String cameraId = cameraManager.getCameraIdList()[0];
// 创建CameraCaptureSession
cameraManager.createCaptureSession(Collections.singletonList(cameraId), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
previewSession = session;
try {
// 设置预览输入源
previewSession.setRepeatingRequest(cameraCaptureRequest, null, handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
Log.e(TAG, "Configuration failed");
}
}, handler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void configureMediaRecorder() {
try {
// 创建MediaRecorder实例
mediaRecorder = new MediaRecorder();
// 设置输出文件
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// 设置输出文件路径
mediaRecorder.setOutputFile(outputFile);
// 设置视频编码器
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
// 设置音频编码器
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
// 设置预览分辨率(根据需要调整)
cameraCaptureRequest.set(CameraCaptureRequest.KEY_FRAME_RATE, 30);
cameraCaptureRequest.set(CameraCaptureRequest.KEY_RESOLUTION, new Size(1280, 720));
// 应用配置
mediaRecorder.setCameraCaptureRequest(cameraCaptureRequest);
} catch (IOException e) {
e.printStackTrace();
}
}
private void startRecording() {
try {
// 准备MediaRecorder
mediaRecorder.prepare();
// 开始录制
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
private void stopRecording() {
if (mediaRecorder != null) {
// 停止录制
mediaRecorder.stop();
// 释放MediaRecorder资源
mediaRecorder.release();
mediaRecorder = null;
}
}
注意:以上示例代码仅供参考,实际实现时可能需要根据具体需求进行调整。同时,处理Camera2 API和MediaRecorder时可能会遇到各种错误和异常情况,需要进行适当的错误处理和异常捕获。