2017-01-27 4 views
0

Ich verwende AVCaptureVideoPreviewLayer (macOS, nicht iOS), um Videoeingaben von einer angeschlossenen Kamera zu erfassen. Ich habe Setup eine Aufnahmesitzung und erstellt eine UIView um das Bild anzuzeigen:AVCaptureVideoPreviewLayer kann nicht auf macOS gespiegelt werden

self.captureLayer = AVCaptureVideoPreviewLayer(session: self.captureSession); self.playerView.layer = self.captureLayer;

Alles funktioniert gut, und ich sehe das Bild von der Kamera, aber jetzt mag ich das Bild spiegeln (vertikal) . Ich bin mit einem CATransform3DMakeScale:

self.captureLayer.transform = CATransform3DMakeScale(-1.0, 1.0, 1.0);

statt Spiegel das Bild jedoch die Schicht geht einfach leer (Hintergrund der übergeordneten Ansicht).

Ich habe andere Transformationen (z. B. Größenänderungen) ausprobiert und sie funktionieren gut. Ich habe versucht, die Spiegelung auch die Superlayer:

self.captureLayer.superLayer?.transform = CATransform3DMakeScale(-1.0, 1.0, 1.0);

Und das funktioniert (obwohl es das gesamte Fenster inklusive der Titelleiste spiegelt!).

Jede Hilfe wird geschätzt. Ich glaube, dass die Transformation korrekt ist, aber aus irgendeinem Grund gilt es nicht für eine AVCaptureVideoPreviewLayer.

+0

können Sie versuchen, die Lösung wie von mir zur Verfügung gestellt? – manishg

+0

Danke @manishganvir - wirklich schätzen die Antwort und Codebeispiel. Werde dieses Wochenende versuchen, aber wenn das funktioniert, gehe ich davon aus, dass es nur eine Spiegelung über den horizontalen Zugriff bereitstellen wird, während CATransform3DMakeScale ich auch vertikal spiegeln kann (was auch in meiner App verwendet wird). –

+0

@manishganvir Habe gerade Ihren Beispielcode - funktioniert super. Auch gefunden 'self.cameraLayer! .connection.videoOrientation = AVCaptureVideoOrientation.portraitUpsideDown' liefert mir eine vertikale Spiegelung. Danke für Ihre Hilfe! –

Antwort

0

Sie können dazu avcaptureconnection-Eigenschaften verwenden.

self.cameraLayer = AVCaptureVideoPreviewLayer(session: frontVideoSession) 
self.cameraLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill 

    if (self.cameraLayer!.connection.isVideoMirroringSupported) 
    { 
     self.cameraLayer!.connection.automaticallyAdjustsVideoMirroring = false 
     self.cameraLayer!.connection.isVideoMirrored = true 
    } 

Sie können mehr über diese Zeilen lesen bei https://developer.apple.com/reference/avfoundation/avcaptureconnection/1389172-isvideomirrored


Die isVideoMirrored Flagge können Sie wählen, ob Sie das Video oder nicht gespiegelt werden soll. Wenn es auf "True" gesetzt ist, wird das Video gespiegelt, wenn es auf "False" gesetzt ist, wird es nicht gespiegelt. Damit Sie dieses Flag verwenden können, müssen Sie das Flag AutomatischVideoMirroring automatisch auf false setzen.


Schrieb einen Beispielcode für Sie https://github.com/manishganvir/mac-camera-mirror-example. Bitte überprüfe das Gleiche. Snippet unter

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


      VideoSession.addInput(input) 

      self.cameraLayer = AVCaptureVideoPreviewLayer(session: VideoSession) 
      print(" connection " , self.cameraLayer!.connection.isVideoMirroringSupported , self.cameraLayer!.connection.automaticallyAdjustsVideoMirroring); 

      if (self.cameraLayer!.connection.isVideoMirroringSupported) 
      { 
       self.cameraLayer!.connection.automaticallyAdjustsVideoMirroring = false 
       self.cameraLayer!.connection.isVideoMirrored = true 
      } 
      self.cameraLayer!.frame = self.view.bounds 

      self.view.layer = self.cameraLayer! 
      self.view.wantsLayer = true 

      VideoSession.startRunning() 
    } 
Verwandte Themen