首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Camera2 api问题触发flash /无闪存图像

Camera2 api问题触发flash /无闪存图像
EN

Stack Overflow用户
提问于 2017-03-28 12:21:22
回答 1查看 2.8K关注 0票数 1

我会解释我的案子。我正在尝试做一个应用程序,每5秒就会拍摄一张图像,一张没有闪光灯,5秒后一张有闪光灯,然后每次重复。所以它需要一个没有闪光,一个有闪光,一个没有闪光,一个有闪光.无穷无尽。

情况是,用我的代码,我可以在一些设备上做到这一点,但相同的代码不能像我想要的那样在其他设备中工作。即:

  • 烧烤X5 :非闪存图像是正确的,但是闪光灯图像将是白色的。
  • 烧烤E5:不会触发闪光灯。

这怎么可能,我尝试过的所有设备都是Camera2 API的遗留硬件支持级别。

这是我的代码中的一些重要方法(由于char限制,我不能发布所有代码)。我从Google的例子开始:

这个setAutoFlash做了上面提到的事情。

代码语言:javascript
复制
private void setAutoFlash(CaptureRequest.Builder requestBuilder) {
        if (mFlashSupported) {
            if(phototaken) {
                requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
                requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
            }else{
                requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
            }
        }
    }

这另一个工作在一些设备和bq阿夸里斯e5,但不触发闪光灯在bq阿夸里斯x5加号。

代码语言:javascript
复制
private void setAutoFlash(CaptureRequest.Builder requestBuilder) {
        if (mFlashSupported) {
            if(phototaken) {
                requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
                requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
            }else{
                requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
                requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
            }
        }
    }

还有我的captureStillPicture

代码语言:javascript
复制
private void captureStillPicture() {
        try {
            final Activity activity = getActivity();
            if (null == activity || null == mCameraDevice) {
                return;
            }
            // This is the CaptureRequest.Builder that we use to take a picture.
            final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
            captureBuilder.addTarget(mImageReader.getSurface());

            // Use the same AE and AF modes as the preview.
            captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                    CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
            setAutoFlash(captureBuilder);

            // Orientation
            int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
            captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation));

            CameraCaptureSession.CaptureCallback CaptureCallback
                    = new CameraCaptureSession.CaptureCallback() {
                @Override
                public void onCaptureCompleted(@NonNull CameraCaptureSession session,
                                               @NonNull CaptureRequest request,
                                               @NonNull TotalCaptureResult result) {
                    showToast("Saved: " + mFile);
                    Log.d(TAG, mFile.toString());
                    unlockFocus();
                }
            };

            mCaptureSession.stopRepeating();
            mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);
            phototaken = !phototaken;

        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
}

问题是,我做错了什么,这样它就不能在所有的设备上工作?任何帮助都会很好。

EN

回答 1

Stack Overflow用户

发布于 2017-03-28 21:34:18

闪存手册有两级控制,并由自动曝光程序控制.你现在把它们混合在一起。

如果要手动触发闪存,则需要将AE_MODE设置为AE_MODE_OFF或AE_MODE_ON,而不是任何闪存模式。然后,FLASH_MODE将控制闪光灯是处于火炬模式,还是关闭,还是为给定的请求启动一次。

由于您总是将AE_MODE放在闪存状态之一,所以除了某个特定设备中的bug之外,您对FLASH_MODE所做的一切都不重要。

如果你想保证每一张照片都有闪光灯,你需要用AE_MODE_ON_ALWAYS_FLASH来拍摄力闪照片,你也需要用AE_MODE_ON来拍摄无闪光灯;不要碰FLASH_MODE。现在,使用AUTO_FLASH,这取决于设备是否触发闪光灯,因此您将看到不同设备和照明条件下的不同行为--有些会触发,有些不会。

另一件关键的事情是运行预捕捉序列;这对于闪光灯图像至关重要,因为它允许设备触发预闪光灯以确定正确的闪光灯功率、焦点和白平衡。

若要运行预捕获,请按需要设置AE_MODE,然后将AE_PRECAPTURE_TRIGGER设置为为一个请求启动。这将将AE_STATE转换为PRECAPTURE,并且它将停留在一些帧中;一旦AE_STATE不再是PRECAPTURE,您就可以发出实际的图像捕获请求。确保在整个过程中保持AE_MODE的一致性。

示例应用程序Camera2Basic实现了预捕获序列,因此请看一下;它还有一些优化,可以跳过预捕捉,以防场景不够黑暗而需要闪光灯,但是由于您想强制触发闪存,所以这与您无关。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43069429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档