在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時可能會遇到各種錯誤和異常情況,需要進行適當的錯誤處理和異常捕獲。