我是靠谱客的博主 朴素篮球,这篇文章主要介绍MediaRecorder的几个常见坑,现在分享给大家,希望可以做个参考。

一、问题代码

复制代码
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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部