MediaRecorder的幾個常見坑
阿新 • • 發佈:2019-02-06
一、問題程式碼
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);