Swift5调用AVCapturePhotoOutput拍照报无活跃可用视频连接错误
错误根因
AVCapturePhotoOutput capturePhotoWithSettings:delegate: No active and enabled video connection 报错本质是AVCapturePhotoOutput未关联到可用的视频输入连接,现有代码存在两处核心配置错误:
- 会话启动时机错误:
captureSession.startRunning()调用过早,未完成会话所有参数配置就启动会话,导致后续配置的sessionPreset不生效,视频连接未正常激活 - 缺少连接有效性校验:添加输出后未校验视频连接状态,部分iOS版本/设备不会自动为AVCapturePhotoOutput创建可用连接
修复代码
修正后的setUpCamera方法
private func setUpCamera() { let captureSession = AVCaptureSession() // 第一步先配置会话预设 captureSession.sessionPreset = AVCaptureSession.Preset.high guard let device = AVCaptureDevice.default(for: .video) else { return } do { let input = try AVCaptureDeviceInput(device: device) if captureSession.canAddInput(input) { captureSession.addInput(input) } if captureSession.canAddOutput(output) { captureSession.addOutput(output) // 显式校验视频连接可用性 guard output.connection(with: .video) != nil else { print("无法创建可用视频连接") return } } // 配置预览层 previewLayer.session = captureSession previewLayer.videoGravity = .resizeAspectFill cameraView.layer.addSublayer(previewLayer) // 所有配置完成后再启动会话 captureSession.startRunning() self.captureSession = captureSession } catch { print(error) } }
补充语法修正
你现有代码中分类声明的Extension首字母大写属于语法错误,需改为小写:
extension CameraViewController: AVCapturePhotoCaptureDelegate { // 原有代理方法保持不变 }
额外校验项
- 触发拍照的方法中,需先判定
captureSession?.isRunning == true再调用capturePhoto(with:delegate:)方法 - 确认Info.plist中已添加
NSCameraUsageDescription相机权限申请,真机运行时已授予相机权限
内容的提问来源于stack exchange,提问作者Esdras Cardenas
相关产品推荐
相关产品推荐

