DepthCamera
DepthCamera
添加到您的项目 在您的 Podfile
中添加 pod 'DepthCamera'
。
然后,您需要在特定文件中调用,将 import DepthCamera
添加到该文件中。
DepthCamera 详细信息
用法:以 2D 或 3D 格式录制视频或图像。方法:使用 AVCaptureDataOutputSynchronizerDelegate
读取数据缓冲区。如果使用 3D 环境,则从深度数据中应用过滤器。这是模拟的 3D 效果。如果录制视频,它将以异步方式将图像添加到视频中。为此,以未知速率添加图像。要进一步说明这一点,请参考下面的 视频创建细节。如果是图像,则简单地记录图像。从那里,可以以 2D (AVPlayer) 格式或 3D (ARKit) 格式获取和表示图像或视频。有关如何使用这些内容的详细信息,请参考下面的 视频播放。有关如何录制视频的详细信息,请参考 视频录制。假设:用户拥有一部能够使用这些资源的手机。
当前问题
在 ChromaKey
中使用的绿色颜色有点不合适。目前,几乎阻止了任何级别的绿色。最终目标是阻止一个非常特定的绿色。
视频创建详情
"RealTimeDepthViewController"内部的 MTKViewDelegate
调用了向 VideoCreator
添加图片的异步调用,以创建视频。尽管委托应该以特定FPS记录,但内部代码导致了"何时可行"的记录。这导致了未知的时间每帧。因为这个原因,我必须为每帧设置一个显示时间。但这些帧可以在未知的时间范围内。在我的测试中,我看到了0.04和0.08帧时间之间,这相当于14 - 25fps。虽然并不完美,但看起来相当不错。然而,音频以正常速率录制,听起来就像是以正常速率录制的。
为了创建立体视频,我们需要一种方法来区分视频。因此,在视频创建过程中,对于每张图片,我们取深度图并将所有太远的像素转换为绿色。现在我们有一个有绿色背景的视频。从这里,我们可以过滤掉绿色像素。当前的过滤并不完美,因为它几乎过滤掉了所有的绿色,但我正在努力改进。使用ChromaKey
过滤后,我们现在就得到了原始视频。
视频录制
拍摄图片
let controller = RealtimeDepthMaskViewController.createRealTimeDepthCameraVC(imageOrVideoCaptureMode: .photo, completionHandler: { (image, _) in
//Do something with image
}, backgroundImages: nil)
self.present(controller, animated: true, completion: nil)
拍摄视频
let controller = RealtimeDepthMaskViewController.createRealTimeDepthCameraVC(imageOrVideoCaptureMode: .video, completionHandler: { (_, url) in
//Do something with url
}, backgroundImages: nil)
self.present(controller, animated: true, completion: nil)
创建RealTimeDepthViewController
并展示它就那么简单。您只需声明它是.video
还是.photo
。然后,确保使用完成处理器在操作完成后访问URL
或UIImage
。
视频播放
注意:当我说2D和3D时,我是在谈论查看器的类型。2D = AVPlayer
和3D = SCNNode / ARKit
。我假设视频是3D视频。如果拍摄的视频不是3D的,则它是一个普通视频,并且不需要进行任何过滤处理。
2D视频
由于视频背景为绿色,我们需要移除它。为此,我们可以简单地应用一个过滤器!这个过滤器已经准备好了,我计划创建一个创建组合的方法,但尚未完成。从那里,我们可以将AVVideoComposition
应用到AVPlayerItem
上,我们就有了一个正常视频!
//You need to create an AVVideoComposition that removes the green pixels using a ChromaKey
let composition = AVMutableVideoComposition(asset: asset) { (request) in
let source = request.sourceImage.clampedToExtent()
let filteredImage = RealtimeDepthMaskViewController.filteredImage(ciimage: source)!.clamped(to: source.extent)
request.finish(with: filteredImage, context: nil)
}
let url = URL(string: "Wherever you store the video")
let asset = AVURLAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
playerItem.videoComposition = composition
2D图像
只要获取你存储位置的图像。它应该是一个黑色背景,因为AVPlayer
不能看到透明通道,尽管特定像素的透明通道为0.0
。因此,是黑色背景。
3D视频
下面的代码一目了然。拥有一个内容场景。RealtimeDepthMaskViewController.get3DChromaKey
是类型为SCNMaterial
的。从这里,我们可以将视频内容的场景应用到新的材料上。然后你有你的SCNNode
,将材料应用到节点上,并在节点上应用ChromaKey
。
let scene = SKScene(size: videoNode.size)
//Add videoNode to scene
scene.addChild(videoNode)
let chromaKeyMaterial = RealtimeDepthMaskViewController.get3DChromaKey()
chromaKeyMaterial.diffuse.contents = scene
node.geometry!.materials = [chromaKeyMaterial]
3D图像
只需获取你存储的图像。由于在ARKit
中SCNNode
可以查看透明通道,因此这是一个清晰的背景。这没问题是因为图像可以包含透明通道,而视频不能。