微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试拍照会导致运行时错误 没有活动且已启用的视频连接

如何解决尝试拍照会导致运行时错误 没有活动且已启用的视频连接

我在下面的目标 swift 代码是拍照然后对照片进行拼接。现在出现一个运行时错误,下面列出来不知道怎么理解。

//Thread 1: "*** -[AVCapturePhotoOutput capturePhotoWithSettings:delegate:] 没有活动和启用的视频连接"

我不知道在代码添加什么来修复这个运行时错误。这段代码有 2 个不同的类 ViewController 和 PreviewVC。

import UIKit;import AVFoundation

class ViewController: UIViewController {

    var b1 = UIButton()
    
    var caputreSession = AVCaptureSession()
    var backCamera : AVCaptureDevice?
    var frontCamera : AVCaptureDevice?
    var currentCamera: AVCaptureDevice?
    var photoOutput : AVCapturePhotoOutput?
    var image : UIImage?
    var captureSESSION = AVCaptureSession()
    
    var cameraPreviewLayer : AVCaptureVideoPreviewLayer?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        
        setupCaputerSession()
        setUpDevice()
        setupinput()
        setUpPreivewLayer()
        startRunningCaptiureSessions()
        
        
        
        [b1].forEach{
            
            $0.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview($0)
            
        }
        b1.backgroundColor = .orange
        b1.frame = CGRect(x: 100,y: 100,width: 100,height: 100)
        b1.addTarget(self,action: #selector(takePHoto),for: .touchDown)
        cameraPreviewLayer?.frame = CGRect(x: 100,y: 300,width: 200,height: 200)
    }
    
    
    func setupCaputerSession (){
        captureSESSION.sessionPreset = AVCaptureSession.Preset.photo
    }
    func setUpDevice(){
        let devicediscoverySession =     AVCaptureDevice.discoverySession(deviceTypes:[AVCaptureDevice.DeviceType.builtInWideAngleCamera],mediaType: AVMediaType.video,position: AVCaptureDevice.Position.unspecified)
        
        let devices = devicediscoverySession.devices
        
        for device in devices {
            if device.position == AVCaptureDevice.Position.back {
                backCamera = device
            }
            else if device.position == AVCaptureDevice.Position.front {
                frontCamera = device
            }
            
        }
        
        currentCamera = backCamera
        
    }
    func setupinput(){
        
        
        do {
            let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!)
            caputreSession.addInput(captureDeviceInput)
            photoOutput = AVCapturePhotoOutput()
            photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey :  AVVideoCodecType.jpeg])],completionHandler: nil)
            captureSESSION.addOutput(photoOutput!)
        }
        catch{
            print(error)
        }
    }
    func setUpPreivewLayer(){
        
        
        cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: caputreSession)
        cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
        cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
        cameraPreviewLayer?.frame = self.view.frame
        self.view.layer.insertSublayer(cameraPreviewLayer!,at: 0)
    }
    func startRunningCaptiureSessions(){
        
        caputreSession.startRunning()
        
    }
    
    @objc func takePHoto(){
        
        let settings = AVCapturePhotoSettings()
        photoOutput?.capturePhoto(with: settings,delegate: self)
        
        let vc = previewVC()
        vc.modalPresentationStyle = .overCurrentContext // actually .fullScreen would be better
        self.present(vc,animated: true)
        
        
        vc.image = self.image
    }
    
    
}
extension ViewController : AVCapturePhotoCaptureDelegate {
    func photoOutput(_ output: AVCapturePhotoOutput,didFinishProcessingPhoto photo: AVCapturePhoto,error: Error?) {
        if let imageData = photo.fileDataRepresentation(){
            
            image = UIImage(data: imageData)
        }
        
    }
    
}
class previewVC: UIViewController {
    
    var displayPic  = UIImageView()
    
    var image : UIImage!
    
    var backBtn = UIButton()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        [displayPic,backBtn].forEach{
            $0.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview($0)
        }
        displayPic.backgroundColor = .red
        backBtn.backgroundColor = .systemteal
        
        displayPic.frame = CGRect(x: 100,y: 200,height: 100)
        backBtn.frame = CGRect(x: 0,width: 10,height: 10)
        
        backBtn.addTarget(self,action: #selector(returnBack),for: .touchDown)
        
        
    }
    @objc func returnBack(){
        let vc = previewVC()
        vc.modalPresentationStyle = .overCurrentContext // actually .fullScreen would be better
        self.present(vc,animated: true)
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?