2016-12-02 4 views
0

私は毎秒カメラプレビューからスクリーンショットを撮りたいです。毎秒SurfaceViewのフレームを取得するには?

私はSurfaceViewを使用してカメラのプレビューを表示します。私は毎秒プレビュー(スクリーンショット)を取得する必要がありますが、写真撮影は使用しません。

私は方法mCamera.setPreviewCallbackWithBufferについて知っていますが、フレームから1回だけ取ることができます。それを毎秒更新するには、MediaRecorderと録画ビデオを開始する必要があります。しかしビデオの場合、私はoutputFileを設定する必要があります。つまり、多くのメモリを使用できます。

mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() { 
     @Override 
     public void onPreviewFrame(byte[] data, Camera camera) { 
      Camera.Parameters parameters = camera.getParameters(); 
      int width = parameters.getPreviewSize().width; 
      int height = parameters.getPreviewSize().height; 

      YuvImage yuv = new YuvImage(data, parameters.getPreviewFormat(), width, height, null); 

      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      yuv.compressToJpeg(new Rect(0, 0, width, height), 50, out); 

      byte[] bytes = out.toByteArray(); 
      final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 

     } 
    }); 

出力ファイルを設定せずに写真を撮るにはどうすればよいですか?

答えて

0

SurfaceViewを使用してカメラのプレビューを表示している場合は、毎秒Camera#takePictureに電話をかけてみてください。

約1秒ごとにスケジュールするには、任意のビューのpostDelayedメソッドを使用できます。たとえば、次のように

private Runnable capturePreview = new Runnable() { 
    @Override 
    public void run() { 
     camera.takePicture(null, null, callback); 

     // Run again after approximately 1 second. 
     surfaceView.postDelayed(this, 1000); 
    } 
} 

private Camera.PictureCallback callback = new Camera.PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

     // Do whatever you need with your bitmap. 

     // Consider freeing the memory afterwards. 
     bitmap.recycle(); 
    } 
} 

そして、あなたはプレビューの準備ができている時はいつでも呼び出すことによって、それを起動することができます。

surfaceView.postDelayed(capturePreview, 1000); 

を、プレビューは、もはや表示されるたびに停止しません:

surfaceView.removeCallbacks(capturePreview); 

あなたはTextureViewを使用している場合getBitmap()を使うだけで、現在の内容を簡単に取得することができます。

private Runnable capturePreview = new Runnable() { 
    @Override 
    public void run() { 
     Bitmap preview = textureView.getBitmap(); 

     // Do whatever you need with the bitmap. 

     // Run again after approximately 1 second. 
     textureView.postDelayed(this, 1000); 
    } 
}, 1000); 

そして再び起動します:

textureView.postDelayed(capturePreview, 1000); 

と停止:

textureView.removeCallbacks(capturePreview); 

したがって、上記のコードは次のようになり

関連する問題