zoukankan      html  css  js  c++  java
  • 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);
        }
  • 相关阅读:
    网上找的Backbone.js
    关于数据结构,剑指offer上面的
    软件工程 什么叫高内聚 低耦合
    【丢失的转化率】你的宝贝,有多少人放进了购物车却没有支付?
    怎么都没人提 google 加密搜索呢? google如何稳定打开
    Mustache.js语法学习笔记
    C# POST数据到指定页面,并跳转至该页面
    将多个图片整合到一张图片中再用CSS 进行网页背景定位
    铁通、长宽网络支付时“签名失败”问题分析及解决方案  [88222001]验证签名异常:FAIL[20131101100002-142]
    jqGrid中多选
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5973334.html
Copyright © 2011-2022 走看看