如何在RealityKit中录制视频?

11

我在Xcode中有一个RealityKit项目,想要录制ARView。我考虑使用ReplayKit,但那只适用于屏幕录制,我只想录制具有相机反馈的ARView。我考虑过AFathi的开源项目ARVideoKit,但是它不支持RealityKit...可能是由于不同的渲染路径。我找到了一篇Medium文章,介绍了如何在ARKit应用程序中实现录制功能,但问题是它需要方法: func renderer(_ renderer: SCNSceneRenderer),而这个方法在RealityKit中不可用,因为它是专门针对SceneKit的方法。


您可以使用ReplayKit,然后可以根据ARView的框架裁剪视频。此外,您还可以在辅助窗口中消除不需要的GUI元素。 - max9xs
我处于同样的情况,但我不会使用ReplayKit。你不仅需要绕过它记录UI元素的事实(这是可能的),而且它会要求用户允许录制屏幕(这很丑陋)。我将尝试找出如何将在session(_ session: ARSession, didUpdate frame: ARFrame)委托方法中生成的YUV视频输出转换为RGB,并以类似于录制视频的方式写入AVCaptureSession。 - JCutting8
@JCutting8 你成功了吗?我也在尝试。 - Jun
我处于同样的情况。还没有找到可行的解决方案吗? - Ruben Nahatakyan
使用ReplayKit,最佳解决方案! - Peter Pohlmann
1个回答

5
假设您已熟悉使用AVAssetWriter记录视频和音频。在ARKit的session(_:didUpdate:)方法中,提供了一个捕获的帧,返回的ARFrame对象具有名为capturedFrameCVPixelBuffer。处理此帧与处理常规录制会话一样,只需将其捕获在captureOutput(_:didOutput:from:)方法中,而是在此处捕获。如果要从麦克风记录音频,则仍然需要captureOutput(_:didOutput:from:)方法。
在我的案例中,我将捕获的帧转换为MTLTexture并使用Metal处理视频帧,然后将它们传递给AVAssetWriter。我想在录制之前在我的相机帧上绘图。不幸的是,这样做非常复杂,并且不能快速简单地复制粘贴答案。但是,希望指向ARKit返回的capturedFrame对象是您开始的好地方。
以下是使用AVAssetWriter记录视频的示例链接: https://programmersought.com/article/80131041234/;jsessionid=38CBA6743FB3C440DE9D2B25A6854B28 如果您想在编码为视频之前将其3D模型绘制到捕获的视频中,则还需要了解Metal: https://developer.apple.com/documentation/metalkit/

我有一定的录制视频经验,因为我曾经使用过Github上的几个相关库。你介意将你代码的某些部分开源吗?我目前正在一个项目中使用https://github.com/Silence-GitHub/BBMetalImage,但我的最近的客户更喜欢RealityKit的相机功能。如果不是开源的话,我也很乐意给你我的电子邮件。非常感谢你的帮助,因为我认为我自己无法应对这一切 :) - Moritz
使用这种方法,AR模型是保存在帧中的吗?还是只有视频源? - Ruben Nahatakyan
@RubenNahatakyan 不确定,因为在我的情况下,我只需要相机的视频流,然后用Metal在其上绘制。所以在我的情况下,我只获取了相机的视频流。 - JCutting8
1
@RubenNahatakyan - session(_:didUpdate:) 提供的 capturedFrame 是原始相机图像,不包括来自您场景中渲染的 AR 内容。 - Michael
这将仅生成视频源的视频,任何AR 3D对象都不会显示。 - Peter Pohlmann
@PeterPohlmann 是的,这已经被Michael提到过了。ARAnchors在委托中提供,如果您愿意,可以使用Metal绘制它们。 - JCutting8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接