Android MediaRecorder錄製視頻提示start failed的解決辦法

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

今天測試MediaRecorder錄製功能的時候出現一個蛋疼的BUG,按照官方提供的示例寫好以後,start竟然報錯,打印日誌一看說:start failed。ide

代碼以下:測試

 

[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來進行判斷,調用以下:this

 

[java]  view plain  copy
 
  1. mCamera.getParameters().getSupportedVideoSizes()  

 

可是有時候即便設置了正確的參數仍舊會出現這個錯誤,這時候可能你就須要再start以前調用一下下面這個方法了:spa

 

[java]  view plain  copy
 
  1. mCamera.unlock();  

這個方法從方法名來看 是解鎖Camera  估計是怕使用設備衝突了把 ,具體緣由之後有空再去看看Camera相關API說明。所以對於這種狀況 我以爲最好的作法是在獲取到Camera對象以後 進行一下以下操做:.net

 

 

[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();  
相關文章
相關標籤/搜索