android音視頻怎么采集

小億
81
2024-10-11 13:24:02

在Android中,音視頻采集主要涉及到使用Intent結(jié)合系統(tǒng)自帶的相機(jī)和麥克風(fēng)應(yīng)用,或者使用Camera2 API和MediaRecorder類(lèi)進(jìn)行更高級(jí)的控制。以下是一些基本的步驟和示例代碼,幫助你實(shí)現(xiàn)音視頻采集功能。

使用系統(tǒng)自帶的相機(jī)和麥克風(fēng)

  1. 請(qǐng)求權(quán)限:首先,你需要在AndroidManifest.xml中聲明相機(jī)和麥克風(fēng)權(quá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" />
  1. 啟動(dòng)相機(jī)和麥克風(fēng):使用Intent啟動(dòng)系統(tǒng)自帶的相機(jī)和麥克風(fēng)應(yīng)用。
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)的控制有限。

使用Camera2 API和MediaRecorder類(lèi)

  1. 創(chuàng)建Camera2 API的預(yù)覽:使用Camera2 API創(chuàng)建一個(gè)預(yù)覽會(huì)話,將預(yù)覽幀傳遞給MediaRecorder進(jìn)行錄制。
  2. 配置MediaRecorder:設(shè)置MediaRecorder的輸入源、輸出格式、編碼器等參數(shù)。
  3. 開(kāi)始錄制:調(diào)用MediaRecorder的start()方法開(kāi)始錄制。
  4. 停止錄制:在適當(dāng)?shù)臅r(shí)候調(diào)用MediaRecorder的stop()方法停止錄制。
  5. 釋放資源:在錄制結(jié)束后,釋放Camera2 API和MediaRecorder的資源。

這種方式的優(yōu)點(diǎn)是你可以更靈活地控制相機(jī)和麥克風(fēng)的行為,但實(shí)現(xiàn)起來(lái)相對(duì)復(fù)雜。

示例代碼(使用Camera2 API和MediaRecorder類(lèi))

  1. 創(chuàng)建預(yù)覽會(huì)話
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();
    }
}
  1. 配置MediaRecorder
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();
    }
}
  1. 開(kāi)始錄制
private void startRecording() {
    try {
        // 準(zhǔn)備MediaRecorder
        mediaRecorder.prepare();
        // 開(kāi)始錄制
        mediaRecorder.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  1. 停止錄制
private void stopRecording() {
    if (mediaRecorder != null) {
        // 停止錄制
        mediaRecorder.stop();
        // 釋放MediaRecorder資源
        mediaRecorder.release();
        mediaRecorder = null;
    }
}
  1. 釋放資源:在Activity的onPause或onDestroy方法中釋放Camera2 API的資源。

注意:以上示例代碼僅供參考,實(shí)際實(shí)現(xiàn)時(shí)可能需要根據(jù)具體需求進(jìn)行調(diào)整。同時(shí),處理Camera2 API和MediaRecorder時(shí)可能會(huì)遇到各種錯(cuò)誤和異常情況,需要進(jìn)行適當(dāng)?shù)腻e(cuò)誤處理和異常捕獲。

0