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

代码片段引自拍摄SDK Vitamio Recorder 2.0:http://www.cnblogs.com/over140/p/3704580.html

本文转自博客园农民伯伯的博客,原文链接:【Android】用MediaRecorder录制视频太短崩的问题,如需转载请自行联系原博主。



目录
相关文章
|
5月前
|
Android开发 容器
35. 【Android教程】视频页面:ViewPager
35. 【Android教程】视频页面:ViewPager
58 3
|
3月前
|
编解码 监控 API
惊艳登场!揭秘如何在Android平台上轻松玩转GB28181标准,实现多视频通道接入的超实用指南!
【8月更文挑战第14天】GB28181是公共安全视频监控联网的技术标准。本文介绍如何在Android平台上实现该标准下的多视频通道接入。首先准备开发环境,接着引入GB28181 SDK依赖并初始化SDK。实现设备注册与登录后,通过指定不同通道号请求多路视频流。最后,处理接收到的数据并显示给用户。此过程涉及视频解码,需确保应用稳定及良好的用户体验。
49 0
|
5月前
|
监控 Android开发 数据安全/隐私保护
安卓kotlin JetPack Compose 实现摄像头监控画面变化并录制视频
在这个示例中,开发者正在使用Kotlin和Jetpack Compose构建一个Android应用程序,该程序 能够通过手机后置主摄像头录制视频、检测画面差异、实时预览并将视频上传至FTP服务器的Android应用
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的高校后勤网上报修系统安卓app附带文章源码部署视频讲解等
56 0
|
5月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的安卓的微博客系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的安卓的微博客系统附带文章和源代码部署视频讲解等
48 2
|
5月前
|
存储 编解码 Android开发
58. 【Android教程】音频录制:MediaRecord
58. 【Android教程】音频录制:MediaRecord
59 2
|
6月前
|
Android开发 内存技术
Android 通过tinyalsa调试解决录制和播放音频问题
Android 通过tinyalsa调试解决录制和播放音频问题
214 1
|
6月前
|
XML Android开发 数据格式
Fragment的使用,零基础入门android逆向视频课程
Fragment的使用,零基础入门android逆向视频课程
|
6月前
|
JSON 网络协议 Android开发
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
339 4
|
6月前
|
Web App开发 Android开发 ice
【Android App】给App集成WebRTC实现视频发送和接受实战(附源码和演示 超详细)
【Android App】给App集成WebRTC实现视频发送和接受实战(附源码和演示 超详细)
671 1