具体表现:

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

错误信息:

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

解决办法:

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

相关代码:

  1. /** 开始录制 */
  2. @Override
  3. public MediaPart startRecord() {
  4. if (mMediaObject != null && mSurfaceHolder != null && !mRecording) {
  5. MediaPart result = mMediaObject.buildMediaPart(mCameraId, ".mp4");
  6.  
  7. try {
  8. if (mMediaRecorder == null) {
  9. mMediaRecorder = new MediaRecorder();
  10. mMediaRecorder.setOnErrorListener(this);
  11. } else {
  12. mMediaRecorder.reset();
  13. }
  14.  
  15. // Step 1: Unlock and set camera to MediaRecorder
  16. camera.unlock();
  17. mMediaRecorder.setCamera(camera);
  18. mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
  19.  
  20. // Step 2: Set sources
  21. mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//before setOutputFormat()
  22. mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//before setOutputFormat()
  23.  
  24. mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  25.  
  26. //设置视频输出的格式和编码
  27. CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
  28. // mMediaRecorder.setProfile(mProfile);
  29. mMediaRecorder.setVideoSize(, );//after setVideoSource(),after setOutFormat()
  30. mMediaRecorder.setAudioEncodingBitRate();
  31. if (mProfile.videoBitRate > * * )
  32. mMediaRecorder.setVideoEncodingBitRate( * * );
  33. else
  34. mMediaRecorder.setVideoEncodingBitRate(mProfile.videoBitRate);
  35. mMediaRecorder.setVideoFrameRate(mProfile.videoFrameRate);//after setVideoSource(),after setOutFormat()
  36.  
  37. mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//after setOutputFormat()
  38. mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//after setOutputFormat()
  39.  
  40. //mMediaRecorder.setVideoEncodingBitRate(800);
  41.  
  42. // Step 4: Set output file
  43. mMediaRecorder.setOutputFile(result.mediaPath);
  44.  
  45. // Step 5: Set the preview output
  46. // mMediaRecorder.setOrientationHint(90);//加了HTC的手机会有问题
  47.  
  48. Log.e("Yixia", "OutputFile:" + result.mediaPath);
  49.  
  50. mMediaRecorder.prepare();
  51. mMediaRecorder.start();
  52. mRecording = true;
  53. return result;
  54. } catch (IllegalStateException e) {
  55. e.printStackTrace();
  56. Log.e("Yixia", "startRecord", e);
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. Log.e("Yixia", "startRecord", e);
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. Log.e("Yixia", "startRecord", e);
  63. }
  64. }
  65. return null;
  66. }
  67.  
  68. /** 停止录制 */
  69. @Override
  70. public void stopRecord() {
  71. long endTime = System.currentTimeMillis();
  72. if (mMediaRecorder != null) {
  73. //设置后不会崩
  74. mMediaRecorder.setOnErrorListener(null);
  75. mMediaRecorder.setPreviewDisplay(null);
  76. try {
  77. mMediaRecorder.stop();
  78. } catch (IllegalStateException e) {
  79. Log.w("Yixia", "stopRecord", e);
  80. } catch (RuntimeException e) {
  81. Log.w("Yixia", "stopRecord", e);
  82. } catch (Exception e) {
  83. Log.w("Yixia", "stopRecord", e);
  84. }
  85. }
  86.  
  87. if (camera != null) {
  88. try {
  89. camera.lock();
  90. } catch (RuntimeException e) {
  91. Log.e("Yixia", "stopRecord", e);
  92. }
  93. }
  94.  
  95. mRecording = false;
  96. }
  97.  
  98. /** 释放资源 */
  99. @Override
  100. public void release() {
  101. super.release();
  102. if (mMediaRecorder != null) {
  103. mMediaRecorder.setOnErrorListener(null);
  104. try {
  105. mMediaRecorder.release();
  106. } catch (IllegalStateException e) {
  107. Log.w("Yixia", "stopRecord", e);
  108. } catch (Exception e) {
  109. Log.w("Yixia", "stopRecord", e);
  110. }
  111. }
  112. mMediaRecorder = null;
  113. }
  114.  
  115. @Override
  116. public void onError(MediaRecorder mr, int what, int extra) {
  117. try {
  118. if (mr != null)
  119. mr.reset();
  120. } catch (IllegalStateException e) {
  121. Log.w("Yixia", "stopRecord", e);
  122. } catch (Exception e) {
  123. Log.w("Yixia", "stopRecord", e);
  124. }
  125. if (mOnErrorListener != null)
  126. mOnErrorListener.onVideoError(what, extra);
  127. }

Android 用MediaRecorder录制视频太短崩的问题的更多相关文章

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

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

  2. Android使用的开发MediaRecorder录制视频

    MediaRecorder除了使用录制音频.还可用于录制视频.关于MediaRecorder的具体解释大家能够參考<Android开发之MediaRecorder类具体解释>.使用Medi ...

  3. 使用MediaRecorder录制视频短片

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

  4. Android多媒体-MediaRecorder 录制音视频

    不多说,直接上代码,有具体凝视 MyAudioRecord.java import java.io.File; import java.io.IOException; import android.a ...

  5. Android拍照,录制视频,相机简单功能实现

    1.效果图,功能没有录制出来. 基本实现了拍照,录制视频,前后摄像头切换的功能,可以转屏,聚焦. 代码在最下面,可以看代码,运行apk看实际效果. 2.权限不能忘 <uses-permissio ...

  6. Android 开发 MediaRecorder使用Camera1配合录制视频

    前言 MediaRecorder可以不依靠Camera API 实现视频的录制,但是如果需要切换摄像头/设置对焦/选择分辨率等等就需要Camera来参与配合录制视频.这篇博客将介绍使用Camera1来 ...

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

    前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...

  8. Android手机录制视频 实时传输(转载)

    最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...

  9. 【Android】 Android实现录音、播音、录制视频功能

    智能手机操作系统IOS与Android平分天下(PS:WP与其他的直接无视了),而Android的免费招来了一大堆厂商分分向Android示好,故Android可能会有“较好”的前景. Android ...

随机推荐

  1. 解决ListCtrl控件第一列文字不能居中显示的问题/修改网格线

    把CListCtrl设置为Report风格,但是插入第一列的时候(InsertColumn)的时候会发现文字不能居中.即使使用了LVCFMT_CENTER,其他列都可以正常居中,但第一列仍然靠左显示. ...

  2. [Node & Testing] Intergration Testing with Node Express

    We have express app: import _ from 'lodash' import faker from 'faker' import express from 'express' ...

  3. kibana中信息分类查询显示的方法

    1.什么是kibana? kibana是ELK(elasticsearch+logstash+kibana)中的K,它是一个可灵活的分析和可视化平台,主要是显示数据以及根据这些数据绘出一些可视化图表, ...

  4. solr索引创建流程

    solr索引创建流程: 分词组件Tokenizer 分词组件(Tokenizer)会做以下几件事情(这个过程称为:Tokenize),处理得到的结果是词汇单元(Token). 1.将文档分成一个一个单 ...

  5. ActiveX控件开发 C#

    转自:http://hi.baidu.com/charlesx_kst/item/9c2f42e2920db3f42b09a4ff 前言: 这段时间因为工作的需要,研究了一下ActiveX控件.总结如 ...

  6. sampleviewer add menu item error 'assert'

    可以跟踪到 mfc提供的源代码内部,(注:如果打开了mfc源代码,设置了断点,但是跟不进去,那就需要更新PDB文件,具体网上搜)打开 wincore.cpp文件(D:\Program Files\Mi ...

  7. POJ2029:Get Many Persimmon Trees(二维树状数组)

    Description Seiji Hayashi had been a professor of the Nisshinkan Samurai School in the domain of Aiz ...

  8. 机器学习分支:active learning、incremental learning、online machine learning

    1. active learning Active learning 是一种特殊形式的半监督机器学习方法,该方法允许交互式地询问用户(或者其他形式的信息源 information source)以获取 ...

  9. 策略模式 VS 桥梁模式

    这对冤家终于碰头了,策略模式与桥梁模式是如此相似,简直就是孪生兄弟,要把它们两个分开需要花费大量智力,我们来看看两者的通用类图,如图33-1所示. 图33-1 策略模式(左)和桥梁模式(右)通用类图 ...

  10. JS错误记录 - fgm练习 - 函数传参

    <script> window.onload = function() { var oBtn = document.getElementsByTagName('button')[0]; v ...