有没有办法在不使用AVCaptureVideoPreviewLayer的情况下显示摄像机图像?

时间:2018-03-23 05:20:54

标签: ios swift

有没有办法在不使用AVCaptureVideoPreviewLayer的情况下显示相机图像? 我想做屏幕截图,但我不能这样做。

    session = AVCaptureSession()

    camera = AVCaptureDevice.default(
        AVCaptureDevice.DeviceType.builtInWideAngleCamera,
        for: AVMediaType.video,
        position: .front) // position: .front
    do {
        input = try AVCaptureDeviceInput(device: camera)

    } catch let error as NSError {
        print(error)
    }

    if(session.canAddInput(input)) {
        session.addInput(input)
    }

    let previewLayer =  AVCaptureVideoPreviewLayer(session: session)
    cameraView.backgroundColor = UIColor.red
    previewLayer.frame = cameraView.bounds
    previewLayer.videoGravity = AVLayerVideoGravity.resizeAspect

    cameraview.layer.addSublayer(previewLayer)
    session.startRunning()

我目前正在尝试播放屏幕截图。它是合成相机图像和一些UIView。但是,如果使用AVCaptureVideoPreviewLayer无法完成屏幕捕获并且不显示摄像机图像。因此,我想显示摄像机图像,以便可以执行屏幕捕获。

1 个答案:

答案 0 :(得分:0)

通常,直接使用GPU显示的视图可能无法在CPU上重绘。这包括openGL内容或这些预览图层等情况。

"屏幕截图"在CPU上的新上下文中重新绘制屏幕,​​这显然忽略了GPU部分。

您应该尝试在会话中添加一些输出,这些输出会为您提供图像,或者更确切地说or_where_in张照片,可用于生成图像。

有很多方法可以做到这一点,但你很可能需要更低一些。您可以向会话添加输出以直接接收样本。这样做有点代码,所以请参考其他一些帖子,如this one。在这一点上你将有一个CMSampleBuffer方法,它将为你提供didOutputSampleBuffer个对象,这些对象可用于构建图像方面的任何内容。

现在在你的情况下,我假设你的目标是从样本缓冲区中获取CMSampleBufferRef。为此,您可能需要再次使用一些代码,因此请参阅其他一些帖子,例如this one

要将它们放在一起,您还可以简单地使用图像视图并删除预览图层。获得样本缓冲区后,您可以创建图像并更新图像视图。我不确定这会是什么表现,但我不鼓励你做这件事。如果图像本身足以满足您的需求,那么您根本不需要视图快照。

但如果你这样做:

在快照上创建此图像。然后使用显示此生成图像的图像视图覆盖预览图层(添加子视图)。然后创建快照并在一个块中删除所有图像视图:

UIImage

让我们知道事情是如何转变的,你尝试了什么,做了什么或不做什么。