115 andHeight:(int)height
116 autoFocusState:(BOOL)autoFocusEnabled
117 videoStabilizationState:(BOOL)videoStabilizationEnabled
118 intrinsicsState:(BOOL)provideIntrinsics
124 NSArray* devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
126 for (AVCaptureDevice* device in devices)
128 if ([device uniqueID] == deviceId)
142 AVCaptureDeviceFormat* bestFormat = nil;
143 AVFrameRateRange* bestRange = nil;
145 for (AVCaptureDeviceFormat* format in [
_camera formats])
147 CMFormatDescriptionRef formatDesc = [format formatDescription];
150 CMVideoDimensions dims = CMVideoFormatDescriptionGetDimensions(formatDesc);
151 if (dims.width == width && dims.height == height)
154 for (AVFrameRateRange* range in [format videoSupportedFrameRateRanges])
157 if (bestRange == nil || bestRange.maxFrameRate < range.maxFrameRate)
169 if ([
_camera lockForConfiguration:nil])
172 [_camera setActiveFormat:bestFormat];
176 CMTime duration = [bestRange minFrameDuration];
177 [_camera setActiveVideoMinFrameDuration:duration];
178 [_camera setActiveVideoMaxFrameDuration:duration];
181 if (autoFocusEnabled)
182 [_camera setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
184 [_camera setFocusModeLockedWithLensPosition:1.0 completionHandler:nil];
187 if (@available(iOS 13.0, *))
189 if ([
_camera isGeometricDistortionCorrectionSupported])
191 [_camera setGeometricDistortionCorrectionEnabled:NO];
202 [_captureSession setAutomaticallyConfiguresCaptureDeviceForWideColor:NO];
204 if ([
_captureSession canSetSessionPreset:AVCaptureSessionPresetInputPriority])
205 [_captureSession setSessionPreset:AVCaptureSessionPresetInputPriority];
210 NSError* error = nil;
211 _cameraInput = [AVCaptureDeviceInput deviceInputWithDevice:_camera
219 [_captureSession addInput:_cameraInput];
230 dispatch_queue_t captureQueue = dispatch_queue_create(
"captureQueue", DISPATCH_QUEUE_SERIAL);
233 [_videoOutput setSampleBufferDelegate:self queue:captureQueue];
237 [_videoOutput setAlwaysDiscardsLateVideoFrames:YES];
240 NSNumber* framePixelFormat = [NSNumber numberWithInt:kCVPixelFormatType_32BGRA];
241 _videoOutput.videoSettings = [NSDictionary dictionaryWithObject:framePixelFormat
242 forKey:(id)kCVPixelBufferPixelFormatTypeKey];
246 [_captureSession addOutput:_videoOutput];
251 AVCaptureConnection* capCon = [_videoOutput connectionWithMediaType:AVMediaTypeVideo];
255 if ([capCon isVideoStabilizationSupported])
257 if (videoStabilizationEnabled)
258 [capCon setPreferredVideoStabilizationMode:AVCaptureVideoStabilizationModeAuto];
260 [capCon setPreferredVideoStabilizationMode:AVCaptureVideoStabilizationModeOff];
263 if (provideIntrinsics && [capCon isCameraIntrinsicMatrixDeliverySupported])
265 [capCon setCameraIntrinsicMatrixDeliveryEnabled:YES];
272 [[NSNotificationCenter defaultCenter] addObserver:self
273 selector:@selector(videoCameraStarted:)
274 name:AVCaptureSessionDidStartRunningNotification
275 object:_captureSession];
278 [_captureSession startRunning];
281 [_camera unlockForConfiguration];