在Android中,音視頻采集主要涉及到使用Intent結(jié)合系統(tǒng)自帶的相機(jī)和麥克風(fēng)應(yīng)用,或者使用Camera2 API和MediaRecorder類(lèi)進(jìn)行更高級(jí)的控制。以下是一些基本的步驟和示例代碼,幫助你實(shí)現(xiàn)音視頻采集功能。
<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);
}
注意:這種方式比較原始,可能需要處理多個(gè)Intent的返回結(jié)果,并且相機(jī)和麥克風(fēng)的控制有限。
這種方式的優(yōu)點(diǎn)是你可以更靈活地控制相機(jī)和麥克風(fēng)的行為,但實(shí)現(xiàn)起來(lái)相對(duì)復(fù)雜。
private void createPreviewSession() {
try {
// 獲取CameraManager
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
// 獲取Camera ID
String cameraId = cameraManager.getCameraIdList()[0];
// 創(chuàng)建CameraCaptureSession
cameraManager.createCaptureSession(Collections.singletonList(cameraId), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
previewSession = session;
try {
// 設(shè)置預(yù)覽輸入源
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 {
// 創(chuàng)建MediaRecorder實(shí)例
mediaRecorder = new MediaRecorder();
// 設(shè)置輸出文件
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// 設(shè)置輸出文件路徑
mediaRecorder.setOutputFile(outputFile);
// 設(shè)置視頻編碼器
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
// 設(shè)置音頻編碼器
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
// 設(shè)置預(yù)覽分辨率(根據(jù)需要調(diào)整)
cameraCaptureRequest.set(CameraCaptureRequest.KEY_FRAME_RATE, 30);
cameraCaptureRequest.set(CameraCaptureRequest.KEY_RESOLUTION, new Size(1280, 720));
// 應(yīng)用配置
mediaRecorder.setCameraCaptureRequest(cameraCaptureRequest);
} catch (IOException e) {
e.printStackTrace();
}
}
private void startRecording() {
try {
// 準(zhǔn)備MediaRecorder
mediaRecorder.prepare();
// 開(kāi)始錄制
mediaRecorder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
private void stopRecording() {
if (mediaRecorder != null) {
// 停止錄制
mediaRecorder.stop();
// 釋放MediaRecorder資源
mediaRecorder.release();
mediaRecorder = null;
}
}
注意:以上示例代碼僅供參考,實(shí)際實(shí)現(xiàn)時(shí)可能需要根據(jù)具體需求進(jìn)行調(diào)整。同時(shí),處理Camera2 API和MediaRecorder時(shí)可能會(huì)遇到各種錯(cuò)誤和異常情況,需要進(jìn)行適當(dāng)?shù)腻e(cuò)誤處理和異常捕獲。