2016-07-13 27 views
0

Ich versuche, Video-Feed mit Glkview zu implementieren, aber immer Rückgabe von Nil von ConnectionWithMediaType, wenn ich versuche, die Rotation zu drehen.connectionWithMediaType return nil

hier sind mein Setup

override public func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 
    videoFeed = GLKView(frame: self.view.bounds, context: EAGLContext(API: .OpenGLES2)) 
    videoFeed.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight] 
    videoFeed.translatesAutoresizingMaskIntoConstraints = true 
    videoFeed.contentScaleFactor = 1.0 
    self.view.addSubview(videoFeed) 
    renderContext = CIContext(EAGLContext: videoFeed.context) 
    sessionQueue = dispatch_queue_create("dCamSession", DISPATCH_QUEUE_SERIAL) 
    videoFeed.bindDrawable() 
} 

override public func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 
    startSession() 
} 

func createSession() -> AVCaptureSession { 
    let cam = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) 
    var input:AVCaptureInput 
    do { 
     input = try AVCaptureDeviceInput(device: cam) 
    } catch _ as NSError { 
     print("Cannot Init Cam") 
     exit(EXIT_FAILURE) 
    } 

    //output 
    let videoOut = AVCaptureVideoDataOutput() 

    videoOut.videoSettings = nil 
    videoOut.alwaysDiscardsLateVideoFrames = true 
    videoOut.setSampleBufferDelegate(self, queue: sessionQueue) 
    //connectionWithMediaType always get nil 
    let connection = videoOut.connectionWithMediaType(AVMediaTypeVideo) 
    if connection.supportsVideoOrientation { 
     connection.videoOrientation = .Portrait 
    } 

    let session = AVCaptureSession() 
    //make sure the stream quality good enough. 
    session.sessionPreset = AVCaptureSessionPresetPhoto 
    session.addInput(input) 
    session.addOutput(videoOut)   
    session.commitConfiguration() 

    return session 

} 

func startSession() { 
    if camSession == nil { 
     camSession = createSession() 
    } 
    camSession.startRunning() 
} 

, was habe ich falsch gemacht?

wenn ich videoOrientation als alles normale entfernen (aber die Ausrichtung ist falsch).

Egal, alles, was Sie brauchen, ist es asynchron aufzurufen.

Antwort

4

Ihr Problem besteht darin, dass Sie versuchten, auf die Verbindung zuzugreifen, bevor Sie videoOut als Ausgabe hinzufügten.

Deshalb funktioniert es auch async: bis Sie connectionWithMediaType anrufen, Ihre addOutput(videoOut) wurde bereits aufgerufen.

+1

danke bro !!!!!! –