1. 程式人生 > >MediaRecorder的幾個常見坑

MediaRecorder的幾個常見坑

一、問題程式碼

private void initRecord() throws IOException {
        mMediaRecorder = new MediaRecorder();
        mMediaRecorder.reset();
        if (mCamera != null)
            mMediaRecorder.setCamera(mCamera);
        mMediaRecorder.setOnErrorListener(this);
        mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface
()); mMediaRecorder.setVideoSource(VideoSource.CAMERA);// 視訊源 mMediaRecorder.setAudioSource(AudioSource.MIC);// 音訊源 mMediaRecorder.setVideoSize(mWidth, mHeight);// 設定解析度: mMediaRecorder.setVideoFrameRate(16);// 這個我把它去掉了,感覺沒什麼用 mMediaRecorder.setVideoEncodingBitRate(1 * 1024
* 1024 * 100);// 設定幀頻率 mMediaRecorder.setOrientationHint(90);// 輸出旋轉90度,保持豎屏錄製 mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);// 視訊輸出格式 mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);// 音訊格式 mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP);// 視訊錄製格式 // mediaRecorder.setMaxDuration
(Constant.MAXVEDIOTIME * 1000); mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath()); mMediaRecorder.prepare(); try { mMediaRecorder.start(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (RuntimeException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }

二、問題解析及解決方案

1、start failed: -19

原因:設定的寬高數值必須要和攝像頭支援的數值相匹配,否則報錯
解決方法:
①把setVideoSize和setVideoFrameRate放到設定編碼和格式的程式碼後面(親測可行)
②不行就把setVideoSize和setVideoFrameRate註釋掉

2、start failed: -38

原因:開始錄影的時候,已經了開啟錄音,搶用麥克風了。
解決方法:把setAudioSource(AudioSource.MIC);換成setAudioSource(AudioSource.DEFAULT)

3、at android.media.MediaRecorder.setVideoSize(Native Method)

原因:setVideoSize是設定視訊解析度,跟裝置硬體有關,若手機不支援則會報該錯誤。
解決方法:
①把setVideoSize和setVideoFrameRate放到設定編碼和格式的程式碼後面(親測可行)
②不行就把setVideoSize和setVideoFrameRate註釋掉

4、at android.media.MediaRecorder.setOutputFormat(Native Method)

原因:
解決方法:
①如果程式碼中設定了setProfile,就把setProfile設定去掉
(
    // CamcorderProfile cProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);//可以提高視訊質量
    // mMediaRecorder.setProfile(cProfile);
)
②更換視訊格式(mp4報錯就換3gp)

三、正常程式碼

貼一份可以在Android6.0上跑的程式碼(被註釋的程式碼可以無視):

private void initRecord() throws IOException {
    mMediaRecorder = new MediaRecorder();
    try {
        mMediaRecorder.reset();
        if (mCamera != null)
            mMediaRecorder.setCamera(mCamera);
        mMediaRecorder.setOnErrorListener(this);
        mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
        mMediaRecorder.setVideoSource(VideoSource.CAMERA);// 視訊源
        mMediaRecorder.setAudioSource(AudioSource.DEFAULT);// 音訊源率,然後就清晰了
        mMediaRecorder.setVideoEncodingBitRate(5*1024*1024);
        mMediaRecorder.setOrientationHint(90);// 輸出旋轉90度,保持豎屏錄製
        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 視訊輸出格式
        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// 音訊格式
        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);// 視訊錄製格式
        // 設定視訊錄製的解析度。必須放在設定編碼和格式的後面,否則報錯
        mMediaRecorder.setVideoSize(320, 240);
        // 設定錄製的視訊幀率。必須放在設定編碼和格式的後面,否則報錯
        mMediaRecorder.setVideoFrameRate(20);

        // mediaRecorder.setMaxDuration(Constant.MAXVEDIOTIME * 1000);
        mMediaRecorder.setOutputFile(mVecordFile.getAbsolutePath());

        mMediaRecorder.prepare();
    } catch (Exception e) {
        e.printStackTrace();
        releaseRecord();
    }
    try {
        mMediaRecorder.start();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (RuntimeException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

四、常見設定

1、編碼格式設定

1) mp4
mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);// 視訊輸出格式
mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);// 音訊格式
mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP);// 視訊錄製格式
2) 3gp
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 視訊輸出格式
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);// 音訊格式
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);// 視訊錄製格式

2、視訊清晰度設定:

// 所說越大清晰度最高(但是我自己測試5*1024*1024是最清晰的)
mMediaRecorder.setVideoEncodingBitRate(5*1024*1024);
// 設定視訊錄製的解析度。必須放在設定編碼和格式的後面,否則報錯
mMediaRecorder.setVideoSize(240,320);
// 設定錄製的視訊幀率。必須放在設定編碼和格式的後面,否則報錯
mMediaRecorder.setVideoFrameRate(20);

五、開源控制元件