当前行为
我在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')}
使用的软件和版本
代码
我在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;
}
答案 0 :(得分:3)
IOS有three Focus Modes
。您需要使用AVCaptureFocusModeContinuousAutoFocus
AVCaptureFocusModeContinuousAutoFocus:相机会根据需要连续自动对焦。
您使用isFocusModeSupported:方法来确定设备是否支持给定的
focus mode
,然后使用focusMode属性设置模式。
react-native-camera
将在两种不同的情况下改变焦点(您可以在此行上使用xcode
设置断点)
focusWithMode
方法仅在您的前置摄像头支持isFocusPointOfInterestSupported
和AVCaptureFocusModeContinuousAutoFocus
仅当以下条件返回[device setFocusMode:focusMode];
时,该方法才会将对焦模式AVCaptureFocusModeContinuousAutoFocus
更改为true
[device isFocusPointOfInterestSupported] && [device isFocusModeSupported:focusMode]
如果条件返回false
,则没有autofocus
,但是图片可能be focused on ExposureMode [device setExposureMode:exposureMode];
updateAutoFocusPointOfInterest
根据用户触摸的x, y
坐标,在用户点击屏幕时更改焦点。由于stackoverflow上有几篇文章(post 1,post 2,post 3,post 4),说明不同的iPhone版本不支持前置摄像头的所有类型的自动对焦,建议您在这些代码行上设置断点,并检查isFocusModeSupported
和isFocusPointOfInterestSupported