Android MediaRecorder录制视频提示start failed的解决办法

转自https://blog.csdn.net/w815878564/article/details/49247411

今天测试MediaRecorder录制功能的时候出现一个蛋疼的BUG,按照官方提供的示例写好之后,start居然报错,打印日志一看说:start failed。

代码如下:

[java] view plain copy

  1. mCamera = Camera.open(0);
  2. surfaceView = new SurfaceView(this);
  3. setContentView(surfaceView);
  4. mSurfaceHolder = surfaceView.getHolder();
  5. mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  6. mRecorder = new MediaRecorder();
  7. mRecorder.setCamera(mCamera);
  8. mRecorder.setAudioSource(AudioSource.DEFAULT);
  9. mRecorder.setVideoSource(VideoSource.DEFAULT);
  10. mRecorder.setOutputFormat(OutputFormat.MPEG_4);
  11. mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
  12. mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
  13. mRecorder.setVideoSize(320, 240);
  14. mRecorder.setVideoFrameRate(20);
  15. mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
  16. File file = new File(Environment.getExternalStorageDirectory()
  17. .getAbsolutePath() + "/test.mp4");
  18. if (file.exists())
  19. {
  20. file.delete();
  21. }
  22. try
  23. {
  24. file.createNewFile();
  25. } catch (IOException e1)
  26. {
  27. e1.printStackTrace();
  28. }
  29. mRecorder.setOutputFile(file.getAbsolutePath());
  30. mSurfaceHolder.addCallback(new Callback()
  31. {
  32. @Override
  33. public void surfaceDestroyed(SurfaceHolder holder)
  34. {
  35. }
  36. @Override
  37. public void surfaceCreated(SurfaceHolder holder)
  38. {
  39. try
  40. {
  41. mRecorder.prepare();
  42. mRecorder.start();
  43. } catch (Exception e)
  44. {
  45. Writer writer = new StringWriter();
  46. PrintWriter printWriter = new PrintWriter(writer);
  47. e.printStackTrace(printWriter);
  48. Throwable cause = e.getCause();
  49. while (cause != null)
  50. {
  51. cause.printStackTrace(printWriter);
  52. cause = cause.getCause();
  53. }
  54. String str = writer.toString();
  55. System.out.println(str);
  56. }
  57. }
  58. @Override
  59. public void surfaceChanged(SurfaceHolder holder, int format,
  60. int width, int height)
  61. {
  62. }
  63. });

一般情况下呢,出现这个原因是由于系统不支持你所设置的分辨率码率这些参数,因此首先需要检查系统是否支持你所设置的参数,参数可以通过Camera的Parameter来进行判断,调用如下:

[java] view plain copy

  1. mCamera.getParameters().getSupportedVideoSizes()

但是有时候即使设置了正确的参数仍旧会出现这个错误,这时候可能你就需要再start之前调用一下下面这个方法了:

[java] view plain copy

  1. mCamera.unlock();

这个方法从方法名来看 是解锁Camera  估计是怕使用设备冲突了把 ,具体原因以后有空再去看看Camera相关API说明。因此对于这种情况 我觉得最好的做法是在获取到Camera对象之后 进行一下如下操作:

[java] view plain copy

  1. mCamera.stopPreview();
  2. mCamera.setPreviewCallback(null);
  3. mCamera.setPreviewCallbackWithBuffer(null);
  4. mCamera.release();
  5. mCamera = null;
  6. mCamera = Camera.open(0);
  7. mCamera.lock();
  8. mCamera.unlock();

原文地址:https://www.cnblogs.com/yangjies145/p/9038279.html

时间: 2024-10-29 04:14:57

Android MediaRecorder录制视频提示start failed的解决办法的相关文章

Android 关于“NetworkOnMainThreadException”出错提示的原因及解决办法

http://blog.csdn.net/aminfo/article/details/7903112 几乎每天都在论坛里面看到有网友问这个问题,代码是无误的,在低版本的API上都可以运行的,但在3.0以上的版本就会出现NetworkOnMainThreadException 出现Android.os.NetworkOnMainThreadException错误提示的原因 原因:不允许在主线程中进行网络访问 解决办法:将网络访问的操作单独放到一个线程中,代码如下: [java] view pla

Android使用的开发MediaRecorder录制视频

MediaRecorder除了使用录制音频.还可用于录制视频.关于MediaRecorder的具体解释大家能够參考<Android开发之MediaRecorder类具体解释>.使用MediaRecorder录制视频与录制音频的步骤基本同样.仅仅是录制视频时不仅须要採集声音.还须要採集图像.为了让MediaRecorder录制时採集图像,应该在调用setAudioSource(int audio source)方法时再调用setVideoSource(int video source)方法来设置

Android开发之使用MediaRecorder录制视频

MediaRecorder除了可以用于录制音频,还可用于录制视频.关于MediaRecorder的详解大家可以参考<Android开发之MediaRecorder类详解>.使用MediaRecorder录制视频与录制音频的步骤基本相同.只是录制视频时不仅需要采集声音,还需要采集图像.为了让MediaRecorder录制时采集图像,应该在调用setAudioSource(int audio source)方法时再调用setVideoSource(int video source)方法来设置图像来

android MediaRecorder录制音频

使用MediaRecorder录制音频步骤: 创建MediaRecorder对象 调用MediaRecorder的setAudioSource()方法设置声音来源,一般传入MediaRecorder.AudioSource.MIC参数指定录制来自麦克风的声音 调用MediaRecorder对象的setOutputFormat()设置所录制的音频 文件的格式 调用MediaRecorder对象的setAudioEncoder() ,setAudioEncodingBitRate(int bitRa

在Android程序中使用Modbus协议时报 java.net.SocketException: recvfrom failed: ECONNRESET解决办法

最近在开发基本Modbus协议的Android端PLC控制程序,C#版程序没有任何问题,移到JAVA下出现各种问题,其中比较苦恼的是java.net.SocketException: recvfrom failed: ECONNRESET错误. 开始我的解决方法是每次向PLC发送一条数据后关掉socket,但是这样做太极端了. 经过分析发现是由于发送的数据包大小我设定为256,当写入1个寄存器值时,Modbus服务端直接报错,关掉了socket连接,将发送的数据包大小改成实际的大小后解决问题.

Android SDK及ADT更新访问问题的解决办法

一.访问问题Eclipse使用SDK Manager更新时总是出现问题 Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refused Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list

Xamarin.Android 反复报 Please Download android_m2repository_rxx.zip 的解决办法

我原来一直用的是老版本的 Xamarin , android_m2repository_rxx.zip 早已在 C:\Users\XXX\AppData\Local\Xamarin\Android.Support.Design\XXX 中存在,所以更新最新的 Xamarin 后, 这一块都是没有任何问题的. 有园友反映这个 zip 明明已经放到了指定的文件夹中,但是还是会反复的 Please download XXXX. 1>C:\Program Files (x86)\MSBuild\Xama

android ndk出现Unresolved inclusion: &lt;jni.h&gt; 的解决办法

在ndk中对项目点击Add Native Support之后,自动生成的cpp文件有时候会出现 Unresolved inclusion: <jni.h>的提示,此时只需要点击一下工具栏中的"锤子"按钮即可 android ndk出现Unresolved inclusion: <jni.h> 的解决办法,码迷,mamicode.com

IE浏览器JS提示缺少对象的解决办法

前端文件中写了一个AJAX取城市列表的JS方法.一个检测表单输入的JS方法,还有一些其它的JS代码. 整个页面代码在chrome和火狐浏览器下一切正常.但是在IE浏览器下在取城市列表的JS方法中提示缺少对象,这个不太具体的报错一开始就让我头疼,因为在chrome等浏览器中是可以运行的,所以初步估计是代码冲突,于是一段代码,一段代码的删,搞了一个小时,发现问题出在检查表单的JS方法里: 表单中有一个选择产品分类的下拉框,这个下拉框的name和ID都定义为:class ,然后在检查表单的JS方法里取