有没有办法在不使用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无法完成屏幕捕获并且不显示摄像机图像。因此,我想显示摄像机图像,以便可以执行屏幕捕获。
答案 0 :(得分:0)
通常,直接使用GPU显示的视图可能无法在CPU上重绘。这包括openGL内容或这些预览图层等情况。
"屏幕截图"在CPU上的新上下文中重新绘制屏幕,这显然忽略了GPU部分。
您应该尝试在会话中添加一些输出,这些输出会为您提供图像,或者更确切地说or_where_in
张照片,可用于生成图像。
有很多方法可以做到这一点,但你很可能需要更低一些。您可以向会话添加输出以直接接收样本。这样做有点代码,所以请参考其他一些帖子,如this one。在这一点上你将有一个CMSampleBuffer
方法,它将为你提供didOutputSampleBuffer
个对象,这些对象可用于构建图像方面的任何内容。
现在在你的情况下,我假设你的目标是从样本缓冲区中获取CMSampleBufferRef
。为此,您可能需要再次使用一些代码,因此请参阅其他一些帖子,例如this one。
要将它们放在一起,您还可以简单地使用图像视图并删除预览图层。获得样本缓冲区后,您可以创建图像并更新图像视图。我不确定这会是什么表现,但我不鼓励你做这件事。如果图像本身足以满足您的需求,那么您根本不需要视图快照。
但如果你这样做:
在快照上创建此图像。然后使用显示此生成图像的图像视图覆盖预览图层(添加子视图)。然后创建快照并在一个块中删除所有图像视图:
UIImage
让我们知道事情是如何转变的,你尝试了什么,做了什么或不做什么。