2013-08-27 35 views
1

我的應用程序目前有一個預覽屏幕,我希望它捕獲許多幀,第二個 進行處理。目前,我的預覽只是每秒存儲一張圖像,但我需要更大的fps捕獲速率。任何幫助,將不勝感激。我的相機預覽是在每秒1幀捕獲

另一個問題(如果可以的話)是我的圖像旋轉90度,當他們出現在我的SD卡上。沒有互聯網的解決方案至今都讓我對這些問題:(

謝謝:)

public class MyCameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{ 

    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public MyCameraSurfaceView(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int weight, 
           int height) { 
     // If your preview can change or rotate, take care of those events here. 
     // Make sure to stop the preview before resizing or reformatting it. 
     mCamera.setDisplayOrientation(90); 

     if (mHolder.getSurface() == null){ 
      // preview surface does not exist 
      return; 
     } 

     // stop preview before making changes 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e){ 
      // ignore: tried to stop a non-existent preview 
     } 

     // make any resize, rotate or reformatting changes here 

     // start preview with new settings 
     try { 

      mCamera.setPreviewDisplay(mHolder); 
      Camera.Parameters parameters = mCamera.getParameters(); 
      List<Camera.Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      mCamera.setParameters(parameters); 
      mCamera.startPreview(); 

     } catch (Exception e){} 

     mCamera.setPreviewCallback(new Camera.PreviewCallback() { 

      public void onPreviewFrame(byte[] data, Camera camera) { 

       Camera.Parameters parameters = camera.getParameters(); 

       int format = parameters.getPreviewFormat(); 

       //YUV formats require more conversion 
       if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) { 
        int w = parameters.getPreviewSize().width; 
        int h = parameters.getPreviewSize().height; 

        // Get the YuV image 
        YuvImage yuv_image = new YuvImage(data, format, w, h, null); 
        // Convert YuV to Jpeg 
        Rect rect = new Rect(0, 0, w, h); 
        ByteArrayOutputStream output_stream = new ByteArrayOutputStream(); 

        yuv_image.compressToJpeg(rect, 10, output_stream); 
        byte[] byt = output_stream.toByteArray(); 

        FileOutputStream outStream = null; 
        try { 
         outStream = new FileOutputStream(String.format(
           "/sdcard/bb%d.jpg", System.currentTimeMillis()/1000)); 

         outStream.write(byt); 
         outStream.close(); 


        } catch (FileNotFoundException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 

        } 

       } 

      } 
     }); 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     // The Surface has been created, now tell the camera where to draw the preview. 
     try { 
      mCamera.setDisplayOrientation(90); 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 


     } catch (IOException e) { 
     } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

    } 

} 

回答

0

首先,請注意Camera.Parameters允許您設置幀速率與setPreviewFrameRate。該值必須在getPreviewFpsRange所述的範圍內。

其次,處理byte[]中的預覽幀會嚴重限制幀速率,因爲需要複製的數據量很大。如果你想將未修改的全幀YUV數據寫入磁盤,那麼你目前沒有選擇。如果您可以處理壓縮工件,並且您的系統爲Android 4.3或更高版本,則可以將數據保存爲MPEG視頻並稍後讀取幀。有關代碼示例,請參閱this page上的CameraToMpegTest.java示例。

將圖像旋轉90度或180度很容易編碼。 Bitmap類可以做到這一點,如果你不想自己寫。