• Android 用MediaRecorder录制视频太短崩的问题


    具体表现:

    调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩。

    错误信息:

         java.lang.RuntimeException: stop failed.
             at android.media.MediaRecorder.stop(Native Method)

    解决办法:

    在stop以前调用setOnErrorListener(null);就行了!

    相关代码:

    /** 开始录制 */
        @Override
        public MediaPart startRecord() {
            if (mMediaObject != null && mSurfaceHolder != null && !mRecording) {
                MediaPart result = mMediaObject.buildMediaPart(mCameraId, ".mp4");
    
                try {
                    if (mMediaRecorder == null) {
                        mMediaRecorder = new MediaRecorder();
                        mMediaRecorder.setOnErrorListener(this);
                    } else {
                        mMediaRecorder.reset();
                    }
    
                    // Step 1: Unlock and set camera to MediaRecorder
                    camera.unlock();
                    mMediaRecorder.setCamera(camera);
                    mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
    
                    // Step 2: Set sources
                    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//before setOutputFormat()
                    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//before setOutputFormat()
    
                    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    
                    //设置视频输出的格式和编码
                    CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
                    //                mMediaRecorder.setProfile(mProfile);
                    mMediaRecorder.setVideoSize(640, 480);//after setVideoSource(),after setOutFormat()
                    mMediaRecorder.setAudioEncodingBitRate(44100);
                    if (mProfile.videoBitRate > 2 * 1024 * 1024)
                        mMediaRecorder.setVideoEncodingBitRate(2 * 1024 * 1024);
                    else
                        mMediaRecorder.setVideoEncodingBitRate(mProfile.videoBitRate);
                    mMediaRecorder.setVideoFrameRate(mProfile.videoFrameRate);//after setVideoSource(),after setOutFormat()
    
                    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//after setOutputFormat()
                    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//after setOutputFormat()
    
                    //mMediaRecorder.setVideoEncodingBitRate(800);
    
                    // Step 4: Set output file
                    mMediaRecorder.setOutputFile(result.mediaPath);
    
                    // Step 5: Set the preview output
                    //                mMediaRecorder.setOrientationHint(90);//加了HTC的手机会有问题
    
                    Log.e("Yixia", "OutputFile:" + result.mediaPath);
    
                    mMediaRecorder.prepare();
                    mMediaRecorder.start();
                    mRecording = true;
                    return result;
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                    Log.e("Yixia", "startRecord", e);
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e("Yixia", "startRecord", e);
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.e("Yixia", "startRecord", e);
                }
            }
            return null;
        }
    
        /** 停止录制 */
        @Override
        public void stopRecord() {
            long endTime = System.currentTimeMillis();
            if (mMediaRecorder != null) {
                //设置后不会崩
                mMediaRecorder.setOnErrorListener(null);
                mMediaRecorder.setPreviewDisplay(null);
                try {
                    mMediaRecorder.stop();
                } catch (IllegalStateException e) {
                    Log.w("Yixia", "stopRecord", e);
                } catch (RuntimeException e) {
                    Log.w("Yixia", "stopRecord", e);
                } catch (Exception e) {
                    Log.w("Yixia", "stopRecord", e);
                }
            }
    
            if (camera != null) {
                try {
                    camera.lock();
                } catch (RuntimeException e) {
                    Log.e("Yixia", "stopRecord", e);
                }
            }
    
            mRecording = false;
        }
    
        /** 释放资源 */
        @Override
        public void release() {
            super.release();
            if (mMediaRecorder != null) {
                mMediaRecorder.setOnErrorListener(null);
                try {
                    mMediaRecorder.release();
                } catch (IllegalStateException e) {
                    Log.w("Yixia", "stopRecord", e);
                } catch (Exception e) {
                    Log.w("Yixia", "stopRecord", e);
                }
            }
            mMediaRecorder = null;
        }
    
        @Override
        public void onError(MediaRecorder mr, int what, int extra) {
            try {
                if (mr != null)
                    mr.reset();
            } catch (IllegalStateException e) {
                Log.w("Yixia", "stopRecord", e);
            } catch (Exception e) {
                Log.w("Yixia", "stopRecord", e);
            }
            if (mOnErrorListener != null)
                mOnErrorListener.onVideoError(what, extra);
        }
  • 相关阅读:
    cocos代码研究(24)Widget子类PageView学习笔记
    cocos代码研究(23)Widget子类ScrollView学习笔记
    cocos代码研究(22)Widget子类Layout学习笔记
    JavaScript:学习笔记(5)——箭头函数=>以及实践
    顽石系列:CSS实现垂直居中的五种方法
    算法:红黑树
    Vue:实践学习笔记(3)——组件使用
    Java进阶学习:将文件上传到七牛云中
    LeetCode:下一个排列【31】
    Linux:Ubuntu下部署Web运行环境
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5973334.html
Copyright © 2020-2023  润新知