首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Metal中脱机呈现/导出帧?

如何在Metal中脱机呈现/导出帧?
EN

Stack Overflow用户
提问于 2018-10-13 05:32:55
回答 1查看 1.3K关注 0票数 6

我是新的金属和我能够实现一个简单的场景四旋转在屏幕上,但我想导出一个1分钟的视频/帧,而不必做的实时。所以想一想,用户只要打开应用程序,点击“导出按钮”,cpu/gpu就可以全速输出1分钟的四转视频/帧,而不需要预览它。

我知道如何使用AVFoundation将帧转换成视频,但不需要实时地将我的3d场景转换成帧。

有人能指点我去哪找吗?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-14 05:16:35

我修改了答案这里和Apple游戏模板来创建这个样本,它演示了如何从金属呈现的一系列帧中直接记录视频文件。

因为金属中的所有渲染都会绘制到一个纹理中,所以很容易调整普通的金属代码,使其适合于脱机呈现为一个电影文件。为重述核心记录过程:

  • 创建一个针对您选择的URL的AVAssetWriter
  • 创建一个AVAssetWriterInput类型的.video,以便您可以编写视频帧。
  • 将一个AVAssetWriterInputPixelBufferAdaptor包在输入周围,这样您就可以将CVPixelBuffer作为帧附加到视频中。
  • 开始记录后,每个帧,将呈现的帧纹理中的像素复制到从适配器的像素缓冲池中获得的像素缓冲区中。
  • 完成后,将输入标记为已完成,并完成对资产编写器的写入。

至于驱动记录,因为您没有收到来自MTKViewCADisplayLink的委托回调,所以您需要自己执行。基本模式如下所示:

代码语言:javascript
复制
for t in stride(from: 0, through: duration, by: frameDelta) {
    draw(in: renderBuffer, depthTexture: depthBuffer, time: t) { (texture) in
        recorder.writeFrame(forTexture: texture, time: t)
    }
}

如果您的呈现和记录代码是异步和线程安全的,则可以将其抛到后台队列中,以保持接口响应。如果呈现需要很长时间,还可以添加一个进度回调来更新UI。

请注意,由于您没有实时运行,您需要确保任何动画都考虑到当前的帧时间(或帧间的时间步长),以便在播放时以适当的速度运行。在我的示例中,我通过让立方体的旋转直接依赖于框架的表示时间来做到这一点。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52789844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档