前置摄像头无法自动对焦或手动对焦

时间:2019-04-25 09:32:35

标签: javascript ios react-native react-native-camera

当前行为

我在iPad / iPhone上使用react-native-camera,并且使用前置摄像头来扫描条形码(Code39,Code128,QR等)。但是,使用前置摄像头时,它不会专注于条形码或我稍微靠近相机放置的任何物品。后置摄像头绝对完美,但是前置摄像头却不能。

我无法测试android,因为我不是纯粹为iOS而为android构建的。我似乎找不到有关使前置摄像头聚焦的任何信息。

如果我要站在背景中,将我的Code39靠近相机,但在底部留一个小缝隙,它将不会尝试聚焦在卡片上,而会聚焦在背景中。

我还在他们的GitHub页面上提出了一个issue here,但是来这里看看是否有人曾经遇到过这个问题,有没有解决的办法等等。

预期行为

我希望照相机看到的代码比我占用的屏幕更多,请专注于它,阅读代码并继续运行代码onBarCodeRead

我试图解决什么?

  • 禁用autoFocus,因为这是Android的修复程序,在这里没有运气。
  • 手动设置focusDepth
  • 手动将autoFocusPointOfInterest设置到屏幕中心。
  • zoom更改为0.2,然后慢慢增加到开始看起来很傻的地步。
  • onGoogleVisionBarcodesDetected设置为console.log,这是android的另一个修复程序。
  • 更新react-native-camera@2.6.0
  • 更新为react-native-camera@git+https://git@github.com/react-native-community/react-native-camera.git的master分支

如何重新创建它?

  • 创建新的本机项目
  • yarn add react-native-camera / npm install react-native-camera --save
  • 设置type={RNCamera.Constants.Type.front}以使用前置摄像头。
  • 设置autoFocus={RNCamera.Constants.AutoFocus.on}(无论如何,默认情况下它处于启用状态,这只是确保了这一点。
  • 设置onBarCodeRead={() => alert('barcode found')}
  • 尝试扫描Code39 / Code128-(creatable here)
  • 尝试扫描它,您会发现相机不会聚焦在它上,而是聚焦在背景上。如果您用手指遮盖相机,也是如此,当您拉开手指时,您会期望相机对背景不清晰,然后尝试重新对焦。事实并非如此,它将集中在中/远距离。

使用的软件和版本

  • iOS:12.1.4
  • 本机相机:^ 2.1.1 / 2.6.0
  • 本机:0.57.7
  • 反应:16.6.1

代码

我在react-native-modal中渲染摄像机,并将代码放在下面。

<RNCamera 
  style={styles.camera}
  type={RNCamera.Constants.Type.front}
  flashMode={RNCamera.Constants.FlashMode.off}
  autoFocus={RNCamera.Constants.AutoFocus.on}
  captureAudio={false}
  onBarCodeRead={(barcode) => {
    if (this.state.isModalVisible) {
      this.setState({
        isModalVisible : false
      }, () => this.captureQR(barcode.data));
    }
}}>

相关软件包代码

我发现一些似乎相关的代码:

RNCamera.m method updateFocusDepth

- (void)updateFocusDepth
{
    AVCaptureDevice *device = [self.videoCaptureDeviceInput device];
    NSError *error = nil;

    if (device == nil || self.autoFocus < 0 || device.focusMode != RNCameraAutoFocusOff || device.position == RNCameraTypeFront) {
        return;
    }

    if (![device respondsToSelector:@selector(isLockingFocusWithCustomLensPositionSupported)] || ![device isLockingFocusWithCustomLensPositionSupported]) {
        RCTLogWarn(@"%s: Setting focusDepth isn't supported for this camera device", __func__);
        return;
    }

    if (![device lockForConfiguration:&error]) {
        if (error) {
            RCTLogError(@"%s: %@", __func__, error);
        }
        return;
    }

    __weak __typeof__(device) weakDevice = device;
    [device setFocusModeLockedWithLensPosition:self.focusDepth completionHandler:^(CMTime syncTime) {
        [weakDevice unlockForConfiguration];
    }];
}

更具体地说,这里仅此部分:

如果device.position == RNCameraTypeFront仅在不满足其他任何条件的情况下才会返回。

    if (device == nil || self.autoFocus < 0 || device.focusMode != RNCameraAutoFocusOff || device.position == RNCameraTypeFront) {
        return;
    }

1 个答案:

答案 0 :(得分:3)

IOS有three Focus Modes。您需要使用AVCaptureFocusModeContinuousAutoFocus

  

AVCaptureFocusModeContinuousAutoFocus:相机会根据需要连续自动对焦。

     

您使用isFocusModeSupported:方法来确定设备是否支持给定的focus mode ,然后使用focusMode属性设置模式。

react-native-camera将在两种不同的情况下改变焦点(您可以在此行上使用xcode设置断点)

  1. focusWithMode方法仅在您的前置摄像头支持isFocusPointOfInterestSupportedAVCaptureFocusModeContinuousAutoFocus
  2. 时设置焦点。

仅当以下条件返回[device setFocusMode:focusMode];时,该方法才会将对焦模式AVCaptureFocusModeContinuousAutoFocus更改为true

[device isFocusPointOfInterestSupported] && [device isFocusModeSupported:focusMode]

如果条件返回false,则没有autofocus但是图片可能be focused on ExposureMode [device setExposureMode:exposureMode];

  1. updateAutoFocusPointOfInterest根据用户触摸的x, y坐标,在用户点击屏幕时更改焦点。

由于stackoverflow上有几篇文章(post 1post 2post 3post 4),说明不同的iPhone版本不支持前置摄像头的所有类型的自动对焦,建议您在这些代码行上设置断点,并检查isFocusModeSupportedisFocusPointOfInterestSupported

的值