swift AVCapturePhotoOutput

在使用的的時(shí)候,遇到"No active and enabled video connection" 崩潰了,后來(lái)發(fā)現(xiàn)是session.addOutput(output)沒(méi)有添加進(jìn)去。

reason: '*** -[AVCapturePhotoOutput capturePhotoWithSettings:delegate:] No active and enabled video connection'

//
//  Created by administrator on 2019/4/20.
//  Copyright ? 2019 . All rights reserved.

import UIKit
import AVFoundation

class PhotoVC: UIViewController,AVCapturePhotoCaptureDelegate{

    var player:AVCaptureVideoPreviewLayer!
    let session = AVCaptureSession()
    let output = AVCapturePhotoOutput()
    var input:AVCaptureDeviceInput!
    var device:AVCaptureDevice!
    @IBOutlet weak var imgView:UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        createCamera()
    }
    
    
    private func createCamera() {
        session.beginConfiguration()
        session.sessionPreset = AVCaptureSession.Preset.photo
        device = AVCaptureDevice.default(for: .video)
    session.automaticallyConfiguresCaptureDeviceForWideColor = true
        guard device != nil else { return }
        do{
            input = try AVCaptureDeviceInput.init(device: device!)
            if session.canAddInput(input) {
                session.addInput(input)
            }else {
                session.commitConfiguration()
                return
            }
            
            if session.canAddOutput(output) {
                session.addOutput(output)
//崩潰的原因是這里寫(xiě)錯(cuò)了session.addOutput(output) 寫(xiě)成了 session.canAddOutput(output)
                output.isHighResolutionCaptureEnabled = true
            }else {
                session.commitConfiguration()
                return
            }
            
            player = AVCaptureVideoPreviewLayer.init(session: session)
            player.frame =  CGRM(0, 0, 160, 100)
            player.videoGravity = .resizeAspectFill
            self.view.layer.addSublayer(player)
            
            session.commitConfiguration()
            session.startRunning()
        }
        catch let error as NSError {
            print("---出錯(cuò)了----\(error)")
        }
    }
    
    
    ///拍照
    @IBAction func onClickBtn(_ sender: UIButton) {
        let settings = AVCapturePhotoSettings()
        if settings.availablePreviewPhotoPixelFormatTypes.count > 0 {
            settings.previewPhotoFormat = [ kCVPixelBufferPixelFormatTypeKey as String : settings.availablePreviewPhotoPixelFormatTypes.first!]
        }
        output.capturePhoto(with: settings, delegate: self)
    }
    
    ///獲取到照片
    func photoOutput(_ captureOutput: AVCapturePhotoOutput,  didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?,  previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings:  AVCaptureResolvedPhotoSettings, bracketSettings:   AVCaptureBracketedStillImageSettings?, error: Error?) {
        
        if let error = error {
            print("-----error occure : \(error.localizedDescription)")
        }
        
        if  let sampleBuffer = photoSampleBuffer,
            let previewBuffer = previewPhotoSampleBuffer,
            let dataImage =  AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer:  sampleBuffer, previewPhotoSampleBuffer: previewBuffer) {
            print(UIImage(data: dataImage)?.size as Any)
            
            let dataProvider = CGDataProvider(data: dataImage as CFData)
            let cgImageRef: CGImage! = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent)
            let image = UIImage(cgImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.right)
            
            self.session.stopRunning()
            self.imgView.image = image
            
        } else {
            print("some error here")
        }
    }
    
}


有什么錯(cuò)誤歡迎批評(píng)指正 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容