Несколько аудио / видео AVCaptureInputs в настоящее время не поддерживаются, когда я пытаюсь запустить кодирование моей камеры - PullRequest
0 голосов
/ 11 мая 2019

Когда я пытаюсь запустить кодирование моей камеры, я получаю следующее сообщение об ошибке

"2019-05-09 23: 15: 48.446844 + 0200 testing2 [514: 31963] Завершение приложения из-за необработанного исключения« NSInvalidArgumentException », причина: '* - [AVCaptureSession addInput:] Несколько аудио / видео AVCaptureInputs в настоящее время не поддерживаются * Первый вызов стека вызовов: libc ++ abi.dylib: завершается с необработанным исключением типа NSException (lldb) "

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

Также пробовал решения с info.plist, так что он не имеет ничего общего с этим.

let captureSession = AVCaptureSession()

var previewLayer:CALayer!

var captureDevice:AVCaptureDevice!

var takePhoto = false

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

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


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)
        }
    }

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}



















struct Constants {
    static let apiKey = "AIzaSyDtaJ5eU24rbnHsG9pb1STOizDJvqcaj5E"
    static let bundleId = "com.felibundle"
    static let searchEngineId = "016628067786358079133:2gm9usqzouc"
}
@IBAction func pish(_ sender: Any) {
    googleSearch(term: "George Bush") { results in
        print(results)}
}
func googleSearch(term: String, callback:@escaping ([(title: String, url: String)]?) -> Void) {
    let urlString = String(format: "https://cse.google.com/cse?cx=016628067786358079133:2gm9usqzouc", term, Constants.searchEngineId, Constants.apiKey)
    let encodedUrl = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

    guard let url = URL(string: encodedUrl ?? urlString) else {
        print("invalid url \(urlString)")
        return
    }

    let request = NSMutableURLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
    request.httpMethod = "GET"
    request.setValue(Constants.bundleId, forHTTPHeaderField: "X-Ios-Bundle-Identifier")

    let session = URLSession.shared
    let datatask = session.dataTask(with: request as URLRequest) { (data, response, error) in
        guard
            error == nil,
            let data = data,
            let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String : Any]
            else {

                callback(nil)
                return
        }

        guard let items = json?["items"] as? [[String : Any]], items.count > 0 else {
            print("no results")
            return
        }

        callback(items.map { ($0["title"] as! String, $0["formattedUrl"] as! String) })
    }


    datatask.resume()
}

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

это должно решить проблему ....

if captureSession.inputs.isEmpty {
    self.captureSession.addInput(deviceInput)
}

0 голосов
/ 11 мая 2019

Может быть, это

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

вызывается несколько раз, когда вы представляете vc выше текущего vc и отклоняете его, так что вы можете поместить его внутрь viewDidLoad

...