#import #import /// 通过名称查找摄像头设备 static AVCaptureDevice *FindCameraByName(const char *cameraName) { if (cameraName == NULL || strlen(cameraName) == 0) { return [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; } NSString *name = [NSString stringWithUTF8String:cameraName]; // iOS 10+ DiscoverySession if (@available(iOS 10.0, *)) { AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera, AVCaptureDeviceTypeBuiltInTelephotoCamera, AVCaptureDeviceTypeBuiltInUltraWideCamera] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified]; for (AVCaptureDevice *device in session.devices) { if ([device.localizedName containsString:name] || [device.modelID containsString:name]) { return device; } } // 没找到精确匹配,返回第一个活跃的 for (AVCaptureDevice *device in session.devices) { if (device.isConnected && !device.isSuspended) { return device; } } } return [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; } extern "C" { /// 启用连续自动对焦和自动曝光(传入 C# 选中的摄像头名称) void _EnableContinuousAutoFocus(const char *cameraName) { dispatch_async(dispatch_get_main_queue(), ^{ AVCaptureDevice *device = FindCameraByName(cameraName); if (!device) { NSLog(@"[CameraFocusHelper] 未找到摄像头设备"); return; } NSLog(@"[CameraFocusHelper] 配置设备: %@ (name=%@, model=%@)", device.localizedName, device.localizedName, device.modelID); NSError *error = nil; if ([device lockForConfiguration:&error]) { // 连续自动对焦 if ([device isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]) { device.focusMode = AVCaptureFocusModeContinuousAutoFocus; NSLog(@"[CameraFocusHelper] 已设为连续自动对焦"); } else { NSLog(@"[CameraFocusHelper] 设备不支持连续自动对焦"); } // 连续自动曝光 if ([device isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) { device.exposureMode = AVCaptureExposureModeContinuousAutoExposure; } // 对焦范围限制为近距 if ([device respondsToSelector:@selector(isAutoFocusRangeRestrictionSupported)] && [device isAutoFocusRangeRestrictionSupported]) { device.autoFocusRangeRestriction = AVCaptureAutoFocusRangeRestrictionNear; NSLog(@"[CameraFocusHelper] 已设对焦范围为近距"); } [device unlockForConfiguration]; NSLog(@"[CameraFocusHelper] 摄像头配置完成"); } else { NSLog(@"[CameraFocusHelper] lockForConfiguration 失败: %@", error.localizedDescription); } }); } /// 确保连续自动对焦仍在生效(传入 C# 选中的摄像头名称) void _EnsureContinuousAutoFocus(const char *cameraName) { dispatch_async(dispatch_get_main_queue(), ^{ AVCaptureDevice *device = FindCameraByName(cameraName); if (!device) return; NSError *error = nil; if ([device lockForConfiguration:&error]) { if (device.focusMode != AVCaptureFocusModeContinuousAutoFocus && [device isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]) { device.focusMode = AVCaptureFocusModeContinuousAutoFocus; NSLog(@"[CameraFocusHelper] 重新设回连续自动对焦"); } [device unlockForConfiguration]; } }); } }