返回选择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闪存所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)