2016-05-01 8 views
0

Ich baue eine Live-Filter-Kamera App in Swift.Capture Foto mit AVFoundation in Swift

Ich ändere von AVCaptureVideoDataOutput() zu AVCaptureStillImageOutput(), um die Fotoaufnahmefunktion durchzuführen. Nachdem ich mich umgezogen habe, gibt es keine Vorschau mehr, wenn ich die App öffne.

Die Aufnahme-Fotofunktion funktioniert, ich kann den Aufnahmesound "Ka" hören, wenn ich auf den Hauptgruppenbereich klicke. Hier gibt es einfach keine Aussicht.

Hier ist mein vollständiger Code

import Foundation 
import UIKit 
import AVFoundation 
import CoreMedia 

let CIHueAdjust = "CIHueAdjust" 
let CIHueAdjustFilter = CIFilter(name: "CIHueAdjust", withInputParameters: ["inputAngle" : 1.24]) 

let Filters = [CIHueAdjust: CIHueAdjustFilter] 

let FilterNames = [String](Filters.keys).sort() 

class LiveCamViewController :  UIViewController,AVCaptureVideoDataOutputSampleBufferDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate{ 
let mainGroup = UIStackView() 
let imageView = UIImageView(frame: CGRectZero) 
let filtersControl = UISegmentedControl(items: FilterNames) 
var videoOutput = AVCaptureStillImageOutput() 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    view.addSubview(mainGroup) 
    mainGroup.axis = UILayoutConstraintAxis.Vertical 
    mainGroup.distribution = UIStackViewDistribution.Fill 

    mainGroup.addArrangedSubview(imageView) 
    mainGroup.addArrangedSubview(filtersControl) 
    mainGroup.addGestureRecognizer(UITapGestureRecognizer(target: self, action:#selector(LiveCamViewController.saveToCamera(_:)))) 

    imageView.contentMode = UIViewContentMode.ScaleAspectFit 

    filtersControl.selectedSegmentIndex = 0 

    let captureSession = AVCaptureSession() 
    captureSession.sessionPreset = AVCaptureSessionPresetPhoto 

    let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 

    do 
    { 
     let input = try AVCaptureDeviceInput(device: backCamera) 

     captureSession.addInput(input) 
    } 
    catch 
    { 
     print("can't access camera") 
     return 
    } 

    //get captureOutput invoked 
    let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
    view.layer.addSublayer(previewLayer) 

    videoOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG] 

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

    captureSession.startRunning() 
} 

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) 
{ 
    guard let filter = Filters[FilterNames[filtersControl.selectedSegmentIndex]] else 
    { 
     return 
    } 

    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 
    let cameraImage = CIImage(CVPixelBuffer: pixelBuffer!) 

    filter!.setValue(cameraImage, forKey: kCIInputImageKey) 

    let filteredImage = UIImage(CIImage: filter!.valueForKey(kCIOutputImageKey) as! CIImage!) 
    let fixedImage = correctlyOrientedImage(filteredImage) 

    dispatch_async(dispatch_get_main_queue()) 
    { 
     self.imageView.image = fixedImage 
    } 

} 

func correctlyOrientedImage(image: UIImage) -> UIImage { 

    UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale) 
    image.drawInRect(CGRectMake(0, 0, image.size.width, image.size.height)) 
    let normalizedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    let imageRef: CGImageRef = normalizedImage.CGImage! 
    let rotatedImage: UIImage = UIImage(CGImage: imageRef, scale: 1.0, orientation: .Right) 

    return rotatedImage 
} 

override func viewDidLayoutSubviews() 
{ 
    mainGroup.frame = CGRect(x: 37, y: 115, width: 301, height: 481) 
} 

func saveToCamera(sender: UITapGestureRecognizer) { 

    videoOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG] 

    if let videoConnection = videoOutput.connectionWithMediaType(AVMediaTypeVideo) { 
     videoOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) { 
      (imageDataSampleBuffer, error) -> Void in 
      let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer) 
      UIImageWriteToSavedPhotosAlbum(UIImage(data: imageData)!, nil, nil, nil) 
     } 
    } 
} 

} 

Dank.

+0

Mögliches Duplikat von [Wie Bild erfassen mit AVCaptureSession in Swift? ] (http://stackoverflow.com/questions/28756363/how-to-capture-picture-with-avcapturesession-in-swift) – iYoung

+0

Sie können diese http://stackoverflow.com/questions/25871513/swift-take verweisen -photo-from-avfoundation? rq = 1 – iYoung

+0

Wenn Sie den Ton hören können. Wahrscheinlich funktioniert Ihr Code für Avfoundation. Ihr Ansichtslayout (Autolayout) oder Ihre Outlets könnten durcheinander geraten, – Shubhank

Antwort

0

Wenn Sie ein Foto oder Video von der Kamera aufnehmen möchten, sollten Sie stattdessen UIImagePickerController anstatt AVFoundation verwenden. Überprüfen Sie Applce documentation für weitere Informationen darüber.

Update:

Siehe this link. Es hat zu viele Beispiele für anpassen imagePickercontroller. und Sie können this und this Antwort von Stackobverflow beziehen.

Hope this helfen :)

+0

Sorry, ich denke, uiimagepickercontroller ist nur erlauben Sie Zugriff auf iphone eigene Kamera. Momentan versuche ich eine komplett angepasste Kamera in meiner App zu erstellen. – dididaisy

+0

können Sie imagePickerController auch auf einer Ebene anpassen !! – Lion

+0

hast du eine Idee, wie das geht? – dididaisy

0

Das Problem könnte sein, dass Sie nicht über einen Rahmen für die previewLayer haben. diese

Typ:

previewLayer.frame = self.view.bounds

Und auch explizit das Video Schwerkraft einstellen: (Ich denke, das ist optional)

previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill // Or choose some other option if you prefer 
+0

Hallo, thx für Ihre Antwort. Es klappt. Aber der Filter ist weg .. Keine Live-Filterabdeckung auf dem Bildschirm .. Soll ich dich hier fragen, oder soll ich eine neue Frage öffnen? Danke! – dididaisy

+0

Hinzufügen der Filter NACH dem Einrichten und Präsentieren sollte die Vorschauebene funktionieren. Sie sind wahrscheinlich verschwunden, da sie der Ansicht hinzugefügt werden, bevor Sie die Vorschauebene anzeigen, und sie befinden sich darunter. Fügen Sie also 'view.addSubview (mainGroup)' unter 'view.addSubview (previewLayer)' hinzu und es sollte funktionieren. Wenn meine Antwort die richtige für Sie war, dann akzeptieren Sie sie bitte und upvote. (drücken Sie den ausgegrauten Tick-Knopf und den Pfeil nach oben über der Zahl, die zur Antwort übrig ist) – Lawrence413

Verwandte Themen