一、问题代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
复制代码
1
2
3
4
5原因:设置的宽高数值必须要和摄像头支持的数值相匹配,否则报错 解决方法: ①把setVideoSize和setVideoFrameRate放到设置编码和格式的代码后面(亲测可行) ②不行就把setVideoSize和setVideoFrameRate注释掉
2、start failed: -38
复制代码
1
2
3原因:开始录像的时候,已经了开启录音,抢用麦克风了。 解决方法:把setAudioSource(AudioSource.MIC);换成setAudioSource(AudioSource.DEFAULT)
3、at android.media.MediaRecorder.setVideoSize(Native Method)
复制代码
1
2
3
4
5原因:setVideoSize是设置视频分辨率,跟设备硬件有关,若手机不支持则会报该错误。 解决方法: ①把setVideoSize和setVideoFrameRate放到设置编码和格式的代码后面(亲测可行) ②不行就把setVideoSize和setVideoFrameRate注释掉
4、at android.media.MediaRecorder.setOutputFormat(Native Method)
复制代码
1
2
3
4
5
6
7
8
9原因: 解决方法: ①如果代码中设置了setProfile,就把setProfile设置去掉 ( // CamcorderProfile cProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);//可以提高视频质量 // mMediaRecorder.setProfile(cProfile); ) ②更换视频格式(mp4报错就换3gp)
三、正常代码
贴一份可以在Android6.0上跑的代码(被注释的代码可以无视):
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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
复制代码
1
2
3
mMediaRecorder.setOutputFormat(OutputFormat.MPEG_4);// 视频输出格式
mMediaRecorder.setAudioEncoder(AudioEncoder.AMR_NB);// 音频格式
mMediaRecorder.setVideoEncoder(VideoEncoder.MPEG_4_SP);// 视频录制格式
2) 3gp
复制代码
1
2
3
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// 视频输出格式
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);// 音频格式
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);// 视频录制格式
2、视频清晰度设置:
复制代码
1
2
3
4
5
6
// 所说越大清晰度最高(但是我自己测试5*1024*1024是最清晰的)
mMediaRecorder.setVideoEncodingBitRate(5*1024*1024);
// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
mMediaRecorder.setVideoSize(240,320);
// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
mMediaRecorder.setVideoFrameRate(20);
五、开源控件
https://github.com/GitLqr/LQRViedoRecordView
最后
以上就是朴素篮球最近收集整理的关于MediaRecorder的几个常见坑的全部内容,更多相关MediaRecorder内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复