Возникла проблема с отображением моего изображения во втором ВК из первого ВК!Вместо этого второй ВК превращается в новый вид камеры - PullRequest
0 голосов
/ 11 мая 2019

Когда я пытаюсь отобразить изображение, которое должно быть снято в первом VC во втором VC, но вместо этого второй VC превращается в вид камеры, похожий на первый VC, что мне не нужно.Я также получаю сообщение об ошибке "причина: '* - [AVCaptureSession addInput:] Несколько аудио / видео AVCaptureInputs в настоящее время не поддерживаются" * Стек первого вызова вызова: libc ++ abi.dylib: завершение с неперехваченным исключениемнаберите NSException (lldb) "

Я пытался изменить мой код новыми кодами камеры, но все еще столкнулся с той же проблемой, поэтому я просмотрел старые вопросы и немного из уроков Youtube, но это тоже мне не помогло.

FirstViewController

let captureSession = AVCaptureSession()
var previewLayer:CALayer!

var captureDevice:AVCaptureDevice!

var takePhoto = false

override func viewDidLoad() {
    super.viewDidLoad()
     prepareCamera()
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

}


func prepareCamera() {
    captureSession.sessionPreset = AVCaptureSession.Preset.photo

    let availableDevices = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back).devices
    captureDevice = availableDevices.first
    beginSession()


}

func beginSession () {
    do {
        let captureDeviceInput = try AVCaptureDeviceInput(device: captureDevice)

        captureSession.addInput(captureDeviceInput)

    }catch {
        print(error.localizedDescription)
    }


    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    self.previewLayer = previewLayer
    self.view.layer.addSublayer(self.previewLayer)
    self.previewLayer.frame = self.view.layer.frame
    captureSession.startRunning()

    let dataOutput = AVCaptureVideoDataOutput()
    dataOutput.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString):NSNumber(value:kCVPixelFormatType_32BGRA)] as [String : Any]

    dataOutput.alwaysDiscardsLateVideoFrames = true

    if captureSession.canAddOutput(dataOutput) {
        captureSession.addOutput(dataOutput)
    }

    captureSession.commitConfiguration()


    let queue = DispatchQueue(label: "com.brianadvent.captureQueue")
    dataOutput.setSampleBufferDelegate(self, queue: queue)

}

@IBAction func takePhoto(_ sender: Any) {
    takePhoto = true

}

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {

    if takePhoto {
        takePhoto = false

        if let image = self.getImageFromSampleBuffer(buffer: sampleBuffer) {

            let photoVC =  UIStoryboard(name: "Main", bundle:  nil).instantiateViewController(withIdentifier: "PhotoVC") as! Viewcontroller2

            photoVC.takenPhoto = image

            DispatchQueue.main.async {
                self.present(photoVC, animated: true, completion: {
                    self.stopCaptureSession()
                })

            }
        }


    }
}


func getImageFromSampleBuffer (buffer:CMSampleBuffer) -> UIImage? {
    if let pixelBuffer = CMSampleBufferGetImageBuffer(buffer) {
        let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
        let context = CIContext()

        let imageRect = CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(pixelBuffer), height: CVPixelBufferGetHeight(pixelBuffer))

        if let image = context.createCGImage(ciImage, from: imageRect) {
            return UIImage(cgImage: image, scale: UIScreen.main.scale, orientation: .right)
        }

    }

    return nil
}

func stopCaptureSession () {
    self.captureSession.stopRunning()

    if let inputs = captureSession.inputs as? [AVCaptureDeviceInput] {
        for input in inputs {
            self.captureSession.removeInput(input)
        }
    }

}

SecondViewController

var takenPhoto:UIImage?

@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    if let availableImage = takenPhoto {
        imageView.image = availableImage
    }


}


@IBAction func goBack(_ sender: Any) {

    self.dismiss(animated: true, completion: nil)

}
...