如何从相机获取 [UIImage] (AVCaptureSession)

问题描述

我正在尝试将我从相机获取的 UIImage 添加到 [UIImage],但是当我使用以下代码时,相机会在添加 12 帧后停止

var temp1:CGImage?

extension VideoCapture: AVCaptureVideoDataOutputSampleBufferDelegate {


    public func captureOutput(_ output: AVCaptureOutput,didOutput sampleBuffer: CMSampleBuffer,from connection: AVCaptureConnection) {
        
       // print(1)
        guard let delegate = self.delegate else { return }
//        print(sampleBuffer.imageBuffer)
        if let pixelBuffer = sampleBuffer.imageBuffer {
            // Attempt to lock the image buffer to gain access to its memory.
            guard CVPixelBufferLockBaseAddress(pixelBuffer,.readOnly) == kCVReturnSuccess
                else {
                    return
            }
            // Create Core Graphics image placeholder.
            var image: CGImage?
            
            
            // Create a Core Graphics bitmap image from the pixel buffer.
            VTCreateCGImageFromCVPixelBuffer(pixelBuffer,options: nil,imageOut: &image)
            dispatchQueue.main.async {
                if image != nil{
                    self.temp.append(image)
                    print(self.temp.count)
                }
                delegate.videoCapture(self,didCaptureFrame: image)
            }

//
            
        }
    }

解决方法

如果您使用 UIImagePickerController ,则可以使用 UIImagePickerControllerDelegate 进行开发

例如


var temp1:UIImage?

extension VideoCapture: UIImagePickerControllerDelegate,UINavigationControllerDelegate {
    
    func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        
        if let image = info[UIImagePickerController.InfoKey(rawValue: "UIImagePickerControllerEditedImage")] as? UIImage {
            
            // modified Image
            temp1 = image.convertToGrayScale()
            
        } else if let image = info[UIImagePickerController.InfoKey(rawValue: "UIImagePickerControllerOriginalImage")] as? UIImage {
            
            // original Image
            temp1 = image.convertToGrayScale()
        }
       
        picker.dismiss(animated: true,completion: nil)
        
    }