You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:15:03