因此,我正在使用AVCaptureSession与前置摄像头拍照。我还在此 session 中创建PreviewLayer,以在屏幕上显示当前图像。

previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill

一切都按预期进行。
但是现在我有一个问题,因为我需要实现一个按钮,该按钮可以翻转/镜像(变换)此预览层-因此用户可以选择拍摄普通的自拍照图片或进行镜像。

我已经尝试过转换PreviewLayer,并且它可以运行。问题在于,如果旋转设备,则预览图片会因为变换而以其他方式旋转。 (默认情况下,或任何其他相机应用程序的图片随相机一起旋转)。任何人都知道如何实现这一目标吗?

镜像预览层:(我尝试过转换层,甚至以后再查看,结果相同)。
@IBAction func mirrorCamera(_ sender: AnyObject) {
  cameraMirrored = !cameraMirrored
  if cameraMirrored {
    // TRANSFORMING VIEW
    self.videoPreviewView.transform = CGAffineTransform(scaleX: -1, y: 1);
    // OR LAYER
    self.previewLayer.transform = CATransform3DMakeScale(-1, 1, 1);
  } else {
    self.videoPreviewView.transform = CGAffineTransform(scaleX: 1, y: 1);
    self.videoPreviewView.transform = CATransform3DMakeScale(1, 1, 1);
  }
}

最佳答案

如今,如果直接使用预览层的mirrored属性,则会在运行时收到弃用警告。当前的方法是直接使用相机的连接。您必须执行类似的操作(下面的代码不是真实的代码,属性名称可能会有所不同,但是您知道了)

if (cameraPreviewLayer.connection.SupportsVideoMirroring) {
  cameraPreviewLayer.connection.automaticallyAdjustsVideoMirroring = false
  cameraPreviewLayer.connection.videoMirrored = true
}

10-04 23:09
查看更多