【问题标题】:Android Camera2 API Cropping VideoAndroid Camera2 API 裁剪视频
【发布时间】:2017-03-03 16:19:20
【问题描述】:

我正在尝试使用 Android Camera2 API 录制视频。我正在尝试通过在请求生成器中设置 SCALER_CROP_REGION 来将视频裁剪为正方形。我正在使用以下代码,但它似乎不起作用

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;
}

【问题讨论】:

  • 到底是什么问题?
  • 设置 SCALER_CROP_REGION 不会改变结果视频中的任何内容。

标签: android camera2 android-camera2


【解决方案1】:

假设 zoom_level=1,SCALER_AVAILABLE_MAX_DIGITAL_ZOOM 为 4,那么你最终得到 ​​p>

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).

这不是居中的,许多设备只支持居中缩放。但它至少是一个方形区域。

真正的问题是您无法通过裁剪更改输出的纵横比 - 创建捕获会话时,纵横比由输出 Surface 的分辨率固定。请参阅 these diagrams 了解裁剪的工作原理。

【讨论】:

  • 什么是 m.width = 3000,m.width=2000?困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 2020-08-04
  • 2013-09-13
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多