ios – 无法在触摸模式下启动iPhone X闪存

ios – 无法在触摸模式下启动iPhone X闪存,第1张

概述我在火炬模式下运行iPhone X闪存时遇到问题. 返回选择AVCaptureDeviceTypeBuiltInTelephotoCamera作为捕获设备: com.apple.avfoundation.avcapturedevice.built-in_video:2' -AVCaptureDeviceTypeBuiltInTelephotoCamera 检查触摸模式可用性后: [self.ca 我在火炬模式下运行iPhone X闪存时遇到问题.

返回选择AVCaptureDeviceTypeBuiltInTelephotoCamera作为捕获设备:

com.apple.avfoundation.avcapturedevice.built-in_vIDeo:2' -AVCaptureDeviceTypeBuiltInTelephotoCamera

检查触摸模式可用性后:

[self.captureDevice isTorchModeSupported:AVCapturetorchModeOn]

我正试图用闪光灯将闪光灯切换到火炬模式

[self.captureDevice lockForConfiguration:nil];BOol result = [self.captureDevice setTorchModeOnWithLevel:1 error:&error];[self.captureDevice unlockForConfiguration];

此通话成功.结果==是和错误==无.但闪光灯闪烁一次然后熄灭.

我自己在iPhone X上看到了这种行为,并且有报告显示iPhone 8和iPhone 8 Plus用户的行为相同.有些用户说在更新到iOS 11.1后出现此问题.但我自己无法用iPhone 8重现它.

有任何想法如何修复或调试此问题?

以下列出的应用中的完整代码段:

// RetrIEve the back camera    if ([AVCaptureDevicediscoverySession class]) {        DDLogDeBUG(@"Search camera with AVCaptureDevicediscoverySession");        AVCaptureDevice* camera =        [AVCaptureDevicediscoverySession         discoverySessionWithDeviceTypes: @[AVCaptureDeviceTypeBuiltInTelephotoCamera]         mediaType:AVMediaTypeVIDeo         position:AVCaptureDevicepositionBack].devices.firstObject;        if (!camera) {            camera = [AVCaptureDevicediscoverySession                      discoverySessionWithDeviceTypes: @[AVCaptureDeviceTypeBuiltInTelephotoCamera]                      mediaType:AVMediaTypeVIDeo                      position:AVCaptureDevicepositionBack].devices.firstObject;        }        DDLogDeBUG(@"DID find %@ camera",camera);        self.captureDevice = camera;    } else {        DDLogDeBUG(@"Haven't found camera device with AVCaptureDevicediscoverySession");    }    if (!self.captureDevice) {        DDLogDeBUG(@"Searching at [AVCaptureDevice devices],where %lu devices available",(unsigned long)AVCaptureDevice.devices.count);        for (AVCaptureDevice *device in [AVCaptureDevice devices]) {            if ([device hasMediaType:AVMediaTypeVIDeo] && [device hasTorch]) {                self.captureDevice = device;                break;            }        }    }    if (!self.captureDevice) {        NSError* error = [NSError buildError:^(MRErrorBuilder *builder) {            builder.localizedDescription = NSLocalizedString(@"There is no camera devices able to measure heart rate",nil);            builder.domain               = kWTCameraHeartRateMonitorError;            builder.code                 = 27172;        }];        DDLogError(@"%@",error);        self.session = nil;        self.handler(0,error);        return NO;    }    NSError *error;    AVCaptureDeviceinput *input = [[AVCaptureDeviceinput alloc] initWithDevice:self.captureDevice                                                                         error:&error];    if (error) {        DDLogError(@"%@",error);        return NO;    }    Nsstring* deviceType = [self.captureDevice respondsToSelector:@selector(deviceType)] ? self.captureDevice.deviceType : @"UnkNown";    DDLogDeBUG(@"Configurating camera '%@'/'%@' - %@ ID %@ at %ld connected: %@",self.captureDevice.localizedname,self.captureDevice.modelID,deviceType,self.captureDevice.uniqueID,(long)self.captureDevice.position,self.captureDevice.connected?@"YES":@"NO");    self.session               = [[AVCaptureSession alloc] init];    Nsstring* preset = [self.session canSetSessionPreset:AVCaptureSessionPresetLow] ? AVCaptureSessionPresetLow : nil;    if (preset) {        self.session.sessionPreset = preset;    }    [self.session beginConfiguration];    [self.session addinput:input];    // Find the max frame rate we can get from the given device    AVCaptureDeviceFormat *currentFormat;    for (AVCaptureDeviceFormat *format in self.captureDevice.formats)    {        NSArray *ranges = format.vIDeoSupportedFrameRateranges;        AVFrameRaterange *frameRates = ranges[0];        // Find the lowest resolution format at the frame rate we want.        if (frameRates.maxFrameRate == FRAMES_PER_SECOND && (!currentFormat || (CMVIDeoFormatDescriptionGetDimensions(format.formatDescription).wIDth < CMVIDeoFormatDescriptionGetDimensions(currentFormat.formatDescription).wIDth && CMVIDeoFormatDescriptionGetDimensions(format.formatDescription).height < CMVIDeoFormatDescriptionGetDimensions(currentFormat.formatDescription).height)))        {            currentFormat = format;        }    }    if (![self.captureDevice isTorchModeSupported:AVCapturetorchModeOn]) {        NSError* error = [NSError buildError:^(MRErrorBuilder *builder) {            builder.localizedDescription = NSLocalizedString(@"Torch mode is not supported for your camera",nil);            builder.domain               = kWTCameraHeartRateMonitorError;            builder.code                 = 28633;        }];        self.session = nil;        DDLogError(@"%@",error);        return NO;    }    // Tell the device to use the max frame rate.    [self.captureDevice lockForConfiguration:nil];    DDLogVerbose(@"Turn on tourch mode with level 0.5");    self.captureDevice.flashMode = AVCaptureFlashModeOff;    BOol result = [self.captureDevice setTorchModeOnWithLevel:0.5 error:&error];    if (!result) {        DDLogError(@"%@",error);        return NO;    }    [self.captureDevice setFocusMode:AVCaptureFocusModeLocked];    [self.captureDevice setFocusModeLockeDWithLensposition:1.0                                         completionHandler:nil];    self.captureDevice.activeFormat = currentFormat;    self.captureDevice.activeVIDeoMinFrameDuration = CMTimeMake(1,FRAMES_PER_SECOND);    self.captureDevice.activeVIDeoMaxFrameDuration = CMTimeMake(1,FRAMES_PER_SECOND);    [self.captureDevice unlockForConfiguration];    // Set the output    AVCaptureVIDeoDataOutput* vIDeoOutput = [AVCaptureVIDeoDataOutput new];    // create a queue to run the capture on    dispatch_queue_t captureQueue=dispatch_queue_create("catpureQueue",disPATCH_QUEUE_SERIAL);    // setup our delegate    [vIDeoOutput setSampleBufferDelegate:self queue:captureQueue];    // configure the pixel format    vIDeoOutput.vIDeoSettings = @{(ID)kCVPixelBufferPixelFormatTypeKey: @(kCVPixelFormatType_32BGRA)};    vIDeoOutput.alwaysdiscardsLateVIDeoFrames = NO;    [self.session addOutput:vIDeoOutput];    if (deBUGPath) {        NSError* error;        [[NSfileManager defaultManager] removeItemAtPath:deBUGPath                                                   error:nil];        BOol result =        [[NSfileManager defaultManager] createDirectoryAtPath:deBUGPath                                  withIntermediateDirectorIEs:YES                                                   attributes:nil                                                        error:&error];        if (result) {            [self setupDeBUGRecordAt:deBUGPath withFormat:currentFormat];        } else {            DDLogError(@"%@",error);        }        const char* path = [deBUGPath cStringUsingEnCoding:NSUTF8StringEnCoding];        self.filter->setDeBUGPath(path);    }    // Start the vIDeo session    [self.session commitConfiguration];    self.frameNumber = 0;    [self.assetWriter startWriting];    [self.assetWriter startSessionAtSourceTime:kCMTimeZero];    [self.session startRunning];
解决方法 最后,问题得到解决.我不确定确切的原因.任何与此问题相关的信息都表示赞赏.

在运行iOS 11.1的iPhone 8,8和iPhone X上存在此​​问题.在将iOS从11.0更新到11.1之后,我在iPhone 8上重现了这种行为.

我注意到火炬在打电话后开启了

BOol result = [self.captureDevice setTorchModeOnWithLevel:0.5 error:&error];

然后关掉

[self.captureDevice setFocusMode:AVCaptureFocusModeLocked];

要么

[self.session commitConfiguration];

因此解决方案是执行火炬配置,其中所有其他会话和设备配置完成并启动会话.

我目前的实施是:

// Session configuration ...[self.session startRunning];if (![self.captureDevice isTorchModeSupported:AVCapturetorchModeOn]) {    NSError* error = [NSError buildError:^(MRErrorBuilder *builder) {        builder.localizedDescription = NSLocalizedString(@"Torch mode is not supported for your camera",nil);        builder.domain               = kWTCameraHeartRateMonitorError;        builder.code                 = 28633;    }];    DDLogError(@"%@",error);    if (self.session) {       [self.session stopRunning];    }    self.session = nil;    self.handler(0,error);    return NO;}[self.captureDevice lockForConfiguration:nil];self.captureDevice.flashMode = AVCaptureFlashModeOff;[self.captureDevice setFocusMode:AVCaptureFocusModeLocked];[self.captureDevice setFocusModeLockeDWithLensposition:1.0                                         completionHandler:nil];self.captureDevice.activeFormat = currentFormat;self.captureDevice.activeVIDeoMinFrameDuration = CMTimeMake(1,FRAMES_PER_SECOND);self.captureDevice.activeVIDeoMaxFrameDuration = CMTimeMake(1,FRAMES_PER_SECOND);// This call should be placed AFTER all other configurationsBOol result = [self.captureDevice setTorchModeOnWithLevel:0.5 error:&error];if (!result) {    DDLogError(@"%@",error);    self.session = nil;    self.handler(0,error);    return NO;}[self.captureDevice unlockForConfiguration];
总结

以上是内存溢出为你收集整理的ios – 无法在触摸模式下启动iPhone X闪存全部内容,希望文章能够帮你解决ios – 无法在触摸模式下启动iPhone X闪存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1073401.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存