2017-03-03 201 views
1

我试图记录采用Android Camera2 API的视频。我试图通过在请求生成器设置SCALER_CROP_REGION裁剪视频作为一个正方形。我使用下面的代码,但它似乎没有工作的Android Camera2 API裁剪视频

mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() { 

    @Override 
    public void onConfigured(CameraCaptureSession cameraCaptureSession) { 
     mCaptureSession = cameraCaptureSession; 
     try { 
      mIsRecording = true; 

      /////****** this where i'm setting the coping 
      mZoom = getZoomRect(); 
      mPreviewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, mZoom); 
      /////////****************** 
      mPreviewRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); 
      HandlerThread thread = new HandlerThread("CameraPreview"); 
      thread.start(); 
      mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, mBackgroundHandler); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) { 
     Log.d(TAG, "onConfigureFailed"); 
    }}, mBackgroundHandler); 

这是应该得到的区域可以裁剪

public int zoom_level = 1; 
public Rect mZoom = null; 

public Rect getZoomRect(){ 
    try { 
     CameraManager manager = (CameraManager) getApplicationContext().getSystemService(Context.CAMERA_SERVICE); 
     CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraId); 
     float maxzoom = (characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM))*10; 
     Rect m = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); 

     int minW = (int) (m.width()/maxzoom); 
     int minH = (int) (m.height()/maxzoom); 
     int difW = m.width() - minW; 
     int difH = m.height() - minH; 
     int cropW = difW /100 *(int)zoom_level; 
     int cropH = difH /100 *(int)zoom_level; 
     cropW -= cropW & 3; 
     cropH -= cropH & 3; 
     mZoom = new Rect(cropW, cropH, m.width() - cropW, m.height() - cropH); 
     ///// if recording video make it square 
     if (mIsRecording) { 
      mZoom = new Rect(cropW, cropH, m.width() - cropW, m.width() - cropW); 
     } 


    } catch (CameraAccessException e) { 
     Log.e(TAG, "can not access camera",e); 
     throw new RuntimeException("can not access camera.", e); 
    } catch (NullPointerException ex) { 
     Log.e(TAG, "touch logic",ex); 
    } 

    return mZoom; 
} 
+0

到底是什么问题? –

+0

设置SCALER_CROP_REGION不会改变最终的视频东西。 –

回答

1

假设zoom_level = 1的代码,SCALER_AVAILABLE_MAX_DIGITAL_ZOOM是4,然后你最终

minW = m.width/40 
minH = m.height/40 
difW = m.width*39/40 
difH = m.height*39/40 
cropW = m.width*39/40/100 * 1 
cropH = m.height*39/40/100 * 1 
(floor cropW/cropH down to nearest multiple of 4) 

如果m.width = 3000,m.width = 2000,然后cropW = 28,cropH = 16

所以mZoom记录是

Rect(28, 16, 2972, 2972). 

这是不集中,许多设备只支持中心变焦。但至少它是一个广场区域。

真正的问题是,你不能改变裁剪输出的宽高比 - 长宽比由输出表面的分辨率当你创建一个捕获会话固定。请参阅these diagrams了解种植方式。