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

Posted 信假名如

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.   
  30. mRecorder.setOutputFile(file.getAbsolutePath());  
  31. mSurfaceHolder.addCallback(new Callback()  
  32. {  
  33.   
  34.     @Override  
  35.     public void surfaceDestroyed(SurfaceHolder holder)  
  36.     {  
  37.   
  38.     }  
  39.   
  40.     @Override  
  41.     public void surfaceCreated(SurfaceHolder holder)  
  42.     {  
  43.         try  
  44.         {  
  45.             mRecorder.prepare();  
  46.             mRecorder.start();  
  47.         } catch (Exception e)  
  48.         {  
  49.             Writer writer = new StringWriter();  
  50.             PrintWriter printWriter = new PrintWriter(writer);  
  51.             e.printStackTrace(printWriter);  
  52.             Throwable cause = e.getCause();  
  53.             while (cause != null)  
  54.             {  
  55.                 cause.printStackTrace(printWriter);  
  56.                 cause = cause.getCause();  
  57.             }  
  58.             String str = writer.toString();  
  59.             System.out.println(str);  
  60.         }  
  61.     }  
  62.   
  63.     @Override  
  64.     public void surfaceChanged(SurfaceHolder holder, int format,  
  65.             int width, int height)  
  66.     {  
  67.   
  68.     }  
  69. });  

一般情况下呢,出现这个原因是由于系统不支持你所设置的分辨率码率这些参数,因此首先需要检查系统是否支持你所设置的参数,参数可以通过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();  

以上是关于Android MediaRecorder录制视频提示start failed的解决办法的主要内容,如果未能解决你的问题,请参考以下文章

Android 中使用MediaRecorder实现视频录制功能

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

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

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

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

尽管以纵向视图录制,但使用 mediaRecorder 和表面视图录制的 Android 视频无法在横向视图中播放