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();  

posted on 2018-05-14 21:36  信假名如  阅读(3649)  评论(0编辑  收藏  举报

导航