一、问题代码

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);

五、开源控件

https://github.com/GitLqr/LQRViedoRecordView

一、问题代码private void initRecord() throws IOException { mMediaRecorder = new MediaRecorder(); mMediaRecorder.reset(); if (mCamera != null) mMediaRecorder.setCamera(mCam
最近项目录制适配时,组内其他人员开发的录制视频很模糊,由我负责解决。 本以为十分简单,万万没想到费了半天功夫。因为资料比较难找,我发现模糊是由于分辨率比较低,以为直接 mMediaRecorder.setVideoSize(640,480); 就ok了,结果不然,发现设置本机的分辨率时,没有问题,但是如果设置的比较小,就会有tart failed异常。 找了很多原因,才发现setV
mMediaRecorder.setVideoSize(videoWidth, videoHeight); //每秒的帧数 mMediaRecorder.setVideoFrameRate(24); //编码格式 mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); 都啥问题注意 1、视频的预览角度 有可能你的预览角度和播放角度都有问题,跟机型有关,也是因为机型的不同可能你们的选择角度还不一样呢,那怎么处理呢?好办法当然是去找算法,去自适应的调整。这里就简单告诉你咋用就完事了, 想要调整捕获的预览角度就要申请Camera对象进行参数调整,
MediaRecorder 录像配置主要涉及输出文件路径、音频来源、视频来源、输出格式、音频编码格式、视频编码格式、比特率、帧率和视频尺寸等。 我们假设视频输入源来自 Camera,Camera2 API 将相机图像渲染到 MediaRecorder 提供的 Surface 上,而 MediaRecorder 将这个渲染数据编码为 H264。 * 配置录制视频相关数据 private void configMediaRecorder(){
1. 报错这种情况一般是由于 初始化顺序不对 或者是设置了分辨率手机不兼容 需要设置为 CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.vid
一. at android.media.MediaRecorder.start(Native Method)解决方法 1. 注释掉 //mRecorder.setVideoFrameRate(15);  2. 设置屏幕分辨率 1)获取屏幕分辨率: DisplayMetrics displaysMetrics = new DisplayMetrics(); getWin
在调用MediaRecorder.setVideoSize方法设置宽高时,由于宽高是动态获取的屏幕宽高,但是这个方法不允许传入奇数值,而出问题的手机的高度刚好就是奇数,所以就报错了。 解决办法就是判断下宽高是否奇数,是的话就减1让它变成偶数,再调用setVideoSize方法 由于该方法是Native方法,暂时不知道为什么一定只能传奇数,有知道的朋友可以下面留言告诉我 以下是一个简单的HTML页面,它包含一个按钮,点击按钮可以调用电脑的麦克风录音,松开按钮停止录音,并将录音文件POST到一个URL地址:<html> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script> $(document).ready(function(){ $("#button").click(function(){ // 开始录音 navigator.mediaDevices.getUserMedia({ audio: true }).then(function(stream) { var mediaRecorder = new MediaRecorder(stream); mediaRecorder.start(); // 松开按钮停止录音 $("#button").mouseup(function(){ mediaRecorder.stop(); // 将录音文件POST到一个URL地址 var xhr = new XMLHttpRequest(); xhr.open('POST', 'http://example.com/upload', true); xhr.send(mediaRecorder.blob); </script> </head> <button id="button">开始录音</button> </body> </html>