【问题标题】:Camera 2 API Video Recording - Auto flash not working相机 2 API 视频录制 - 自动闪光不工作
【发布时间】:2018-01-30 11:26:30
【问题描述】:

我已经实现了一个自定义摄像头,它使用 camera2 API 录制视频。有一个选项可以将闪光灯设置为“开”、“关”和“自动”。 将闪光灯设置为“自动”不起作用,而其他选项工作正常。

代码如下:

    private void updateFlash() {
            Log.e(TAG, "Flash = " + currentFlash);
            switch (currentFlash) {
                case Constants.FLASH_OFF:
                    previewRequestBuilder.set(CaptureRequest.FLASH_MODE,
                            CaptureRequest.FLASH_MODE_OFF);
                    break;
                case Constants.FLASH_ON:
                    previewRequestBuilder.set(CaptureRequest.FLASH_MODE,
                            CaptureRequest.FLASH_MODE_TORCH);
                    break;
                case Constants.FLASH_TORCH:
                    previewRequestBuilder.set(CaptureRequest.FLASH_MODE,
                            CaptureRequest.FLASH_MODE_TORCH);
                    break;
                case Constants.FLASH_AUTO:
                    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

                    break;
            }
 cameraCaptureSession.setRepeatingRequest(previewRequestBuilder.build(),
                        null, null);
}

我用谷歌搜索了很多,并尝试了几乎所有关于自动闪存的 stackoverflow 答案,但没有一个奏效。

请帮忙。我不明白这是什么问题。

【问题讨论】:

  • 能否请您尝试在您的自动闪光灯盒中设置闪光灯模式关闭。
  • 试过了.. 不适用于视频...
  • @Sahil 这个问题与自动闪光灯无关。加上它与旧相机 API 的关系。
  • 嗨 imDroid,你发现了吗?我自己也遇到了同样的问题

标签: android camera android-camera2


【解决方案1】:

我骗了!我写了一个‍CaptureCallback,在onCaptureCompleted回调中,我得到AE_STATE,如果AE_STATE等于CONTROL_AE_STATE_FLASH_REQUIRED,那么我手动打开闪光灯。此解决方案不适用于某些设备,例如三星 J7 或三星 A5。在 AE_STATE 返回 null 的设备上,此解决方案将不起作用。半条面包总比没有面包好。 :)

 private CameraCaptureSession.CaptureCallback captureCallback
        = new CameraCaptureSession.CaptureCallback() {

    @Override
    public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                                   @NonNull CaptureRequest request,
                                   @NonNull TotalCaptureResult result) {
        if (previewFlashMode == FLASH_AUTO) {
            Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
            if (aeState != null) {
                if (currentPreviewFlashMode != FLASH_ON && aeState == CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED) {
                    setFlashMode(captureRequestBuilder, FLASH_ON);
                    setRepeatingRequestAfterSetFlash();
                }
            }
        }

    }

};

您应该将回调添加到setRepeatingRequest

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多