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

曾无好事来相访,赖尔高文一起予。这篇文章主要讲述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()   
 
【Android MediaRecorder录制视频提示start failed的解决办法】但是有时候即使设置了正确的参数仍旧会出现这个错误,这时候可能你就需要再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();    

    推荐阅读