具体表现:

调用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录制视频太短崩的问题,如需转载请自行联系原博主。

【Android】用MediaRecorder录制视频太短崩的问题相关推荐

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

    具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩. 错误信息: java.lang.RuntimeException: stop ...

  2. Android音视频之MediaRecorder录制视频

    1 MediaRecorder 录制视频步骤 这篇文章介绍了Android录音MediaRecorder使用和SoundPool的使用 主要讲解了音频的录制和播放,这篇AudioRecord和Audi ...

  3. Android多媒体四:MediaRecorder录制视频短片

    Android多媒体四:MediaRecorder录制视频短片 MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同. 只 ...

  4. 使用MediaRecorder录制视频短片

    MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同.只是录制视频时不仅需要采集声音,还需要采集图像.为了让MediaRe ...

  5. Android自定义照相机录制视频

    Android端视频的录制: 1.自定义Camera和MediaRecorder录制视频和拍摄照片,基本功能都能实现,但是也存在一定的问题.a.后置摄像头拍摄完成后照片自动旋转90度或者270度b.如 ...

  6. 前端 mediaRecorder 录制视频源代码实例,和本地播放器无法定位进度条问题分析和解决

    问题 mediaRecorder 本质上录制的是webm 当我们使用getUserMedia.MediaRecorder等API生成的webm视频时,会发现最终的webm是无法拖动进度条的 解决方案 ...

  7. MediaRecorder录制视频时计算文件大小

    MediaRecorder录制视频时通过音频编码率和视频编码率计算文件大小或时间 计算公式:(音频编码率(单位k)+视频编码率(单位k))/8*时间(秒) = 文件大小(kb) 例: mediaRec ...

  8. Android MediaRecorder录制视频音量小问题解决 (音视频转码合成)

    之前写得太乱,回头看看感觉自己都有点看不懂,重新写下. 在android上需要做一个录像留言功能,需要生成MP4或者waw格式视频.但是使用MediaRecorder录制出的MP4视频格式音量太小,几 ...

  9. Android MediaRecorder录制视频详细步骤

    使用MediaRecorder能够编写从设备麦克风与相机捕获音视频,保存音频并(使用MediaPlayer)进行播放的应用. 1.添加权限: <uses-permission android:n ...

  10. Android音视频开发:MediaRecorder录制视频

    简介 安卓api提供了Camera类控制相机捕获图像,在api21以后,安卓也提供了Camera2,Camera变得过时了,但为了兼容性,这里还是使用Camera. 对于录制视频,可以使用MediaR ...

最新文章

  1. Xamarin Essentials教程数据传输DataTransfer
  2. 四十八、Python中的GUI布局tkinter
  3. CentOS7中使用yum安装Nginx的方法(亲测启动方法)
  4. react native (一)
  5. 年薪60w财务总监的加薪秘诀:从不用Excel做报表
  6. testlink匹配mysql8_如何安装Testlink
  7. WeX5 - AJAX跨域调用相关知识-CORS和JSONP
  8. aGlass 2 绘出射线的交点并用红色小球显示
  9. 拼音模糊查询+java,拼音模糊查询实现
  10. Linux版的led显示屏控制软件,中航Led显示屏控制软件下载
  11. 映美精双目相机无法同时显示的问题
  12. 计算机cpu温度显示原理,可以相信软件显示的CPU温度吗
  13. 百度网盘视频加速代码
  14. Windows10 使用Win32.Mak 进行makefile编译
  15. 计算机管理器用户怎么打开,win10无法使用内置管理员账户打开计算器如何设置...
  16. macmini作为远程服务器,我在用我的 Mac mini 做什么
  17. docker ss-pannel_docker+traefik配置mysql + panel
  18. 【PAT】A1099. Build A Binary Search Tree (30)
  19. (17)打鸡儿教你Vue.js
  20. 干货| 乐队的混音应该如何改善?职业混音师的建议 MZD Studios

热门文章

  1. Atitit 工作流之道 艾提拉著 BPM,即业务流程管理 目录 1. 流程入门 思想 历史 分类 1 第二篇 第2章 初识工作流 2 1.1. 2.3 工作流技术相关规范  2.3.1 W
  2. Atitit  图像处理底色变红的解决
  3. Atitit. Xss 漏洞的原理and应用xss木马
  4. Atitit.为什么小公司也要做高大上开源项目
  5. paip.提升用户体验---免维护列表字段
  6. 软件逆向分析方法小结
  7. 十大旗舰基金是怎样炼成的(主动权益)
  8. 并不是部所有市场都类似:评估 Marketplace 的 10 个特征
  9. gunicorn: No module named 'fcntl'
  10. Rust : standford 操作系统课与rust各种指针图