2017-01-29 1 views
0

Ich erstelle gerade eine einfache Anwendung, die AVFoundation verwendet, um Video in eine UIImageView zu streamen.Aufnehmen von Standbildern mit AVFoundation

Um dies zu erreichen, habe ich eine Instanz von AVCaptureSession() und eine AVCaptureSessionPreset():

let input = try AVCaptureDeviceInput(device: device) 
       print(input) 
       if (captureSession.canAddInput(input)) { 
        captureSession.addInput(input) 

        if (captureSession.canAddOutput(sessionOutput)) { 
         captureSession.addOutput(sessionOutput) 
         previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
         previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
         previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.portrait 

         cameraView.layer.addSublayer(previewLayer) 
         captureSession.startRunning() 

cameraView Verweise auf die UIImageView Steckdose.

Ich möchte jetzt eine Möglichkeit zum Erfassen eines Standbildes aus der AVCaptureSession implementieren.

Korrigieren Sie mich, wenn es einen effizienteren Weg gibt, aber ich plane, eine zusätzliche UIImageView zu haben, um das Standbild zu halten, das auf die UIImageView gelegt wird, die das Video hält?

ich eine Schaltfläche mit der Aktion erstellt habe:

@IBAction func takePhoto(_sender: Any) { 
    // functionality to obtain still image 
} 

Mein Problem ist, ich bin nicht sicher, wie eigentlich ein Standbild von der Aufnahmesitzung erhalten und die neuen UIImageView damit füllen.

Nach an Informationen suchen/Fragen auf Stack geschrieben, ist die Mehrheit der Lösungen zu verwenden:

unsicher
captureStillImageAsynchronouslyFromConnection 

Ich bin, wenn es 3.0 nur Swift ist aber xCode ist diese Funktion nicht zu erkennen.

Könnte jemand bitte mich beraten, wie man tatsächlich das Ergebnis des Erlangens und der Anzeige eines Standbildes auf Tastendruck erreicht.

Here ist ein Link zu meinem vollständigen Code für ein besseres Verständnis meines Programms.

Vielen Dank im Voraus, dass Sie sich die Zeit genommen haben, meine Frage zu lesen, und bitte sagen Sie mir, falls ich einige relevante Daten verpasst habe.

+0

[Obi-Wan Kenobi Stimme] zu finden! In Swift 3 ist es ['captureStillImageAsynchronously (from: completionHandler:)'] (https://developer.apple.com/reference/avfoundation/avcapturestillimeimoutput/1387374-capturestilleimageasynchron). – matt

+0

Sie können diese verweisen http://stackoverflow.com/questions/28756363/how-to-capture-picture-with-avcapturesession-in-swift –

Antwort

1

Wenn Sie auf iOS 10 oder höher ausgerichtet sind. captureStillImageAsynchronously(from:completionHandler:) ist zusammen mit AVCaptureStillImageOutput veraltet.

Gemäß der Dokumentation

Die AVCaptureStillImageOutput Klasse wird in iOS 10.0 veraltet und nicht nicht neue Kamera-Capture-Funktionen wie RAW-Bildausgabe, Live-Fotos oder Wide-Gamut-Farben unterstützen. Verwenden Sie in iOS 10.0 und höher stattdessen die Klasse AVCapturePhotoOutput. (Die AVCaptureStillImageOutput Klasse bleibt in macOS 10.12 unterstützt.)

Wie pro Ihre Code, den Sie bereits AVCapturePhotoOutput verwenden. Befolgen Sie einfach die folgenden Schritte, um ein Foto aus der Sitzung zu machen. Dasselbe kann hier in Apple documentation gefunden werden.

  1. Erstellen Sie ein AVCapturePhotoOutput-Objekt. Verwenden Sie seine Eigenschaften, um unterstützte Aufnahmeeinstellungen zu bestimmen und bestimmte Funktionen zu aktivieren (z. B. um Live-Fotos zu erfassen).
  2. Erstellen und konfigurieren Sie ein AVCapturePhotoSettings-Objekt, um Funktionen und Einstellungen für eine bestimmte Aufnahme auszuwählen (z. B. ob Bildstabilisierung oder Blitz aktiviert werden soll).
  3. Erfassen Sie ein Bild, indem Sie Ihr Foto-Einstellungsobjekt an die Methode capturePhoto (with: delegate :) zusammen mit einem Delegate-Objekt übergeben, das das AVCapturePhotoCaptureDelegate-Protokoll implementiert. Die Bilderfassungsausgabe ruft dann Ihren Stellvertreter auf, um Sie während des Erfassungsprozesses über wichtige Ereignisse zu benachrichtigen.

Sie tun bereits Schritt 1 und 2. So diese Zeile im Code

@IBAction func takePhoto(_sender: Any) { 
     print("Taking Photo") 
     sessionOutput.capturePhoto(with: sessionOutputSetting, delegate: self as! AVCapturePhotoCaptureDelegate) 

    } 

und implementieren die AVCapturePhotoCaptureDelegate Funktion

optional public func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) 

Hinweis hinzufügen, dass diese Delegierten viel Kontrolle geben über das Fotografieren. Weitere Informationen finden Sie in der Dokumentation. Außerdem müssen Sie die Bilddaten verarbeiten, was bedeutet, dass Sie den Beispielpuffer in UIImage konvertieren müssen.

if sampleBuffer != nil { 
    let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) 
    let dataProvider = CGDataProviderCreateWithCFData(imageData) 
    let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault) 
    let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right) 
    // ... 
    // Add the image to captureImageView here... 
} 

Beachten Sie, dass das Bild, das Sie erhalten, nach links gedreht wird, so dass wir manuell nach rechts drehen müssen, um eine Vorschau wie das Bild zu erhalten. Uuuuuse die Dokumentation, Luuuuuke:

Weitere Informationen finden Sie in meinem vorherigen SO answer

+0

Wow, danke für das. Brillant. –

+0

@ F.Bar Ich bin durch deine Straße gegangen. Keine Erwähnung. – Bluewings

Verwandte Themen