我是新的金属和我能够实现一个简单的场景四旋转在屏幕上,但我想导出一个1分钟的视频/帧,而不必做的实时。所以想一想,用户只要打开应用程序,点击“导出按钮”,cpu/gpu就可以全速输出1分钟的四转视频/帧,而不需要预览它。
我知道如何使用AVFoundation将帧转换成视频,但不需要实时地将我的3d场景转换成帧。
有人能指点我去哪找吗?
非常感谢!
发布于 2018-10-14 05:16:35
我修改了答案这里和Apple游戏模板来创建这个样本,它演示了如何从金属呈现的一系列帧中直接记录视频文件。
因为金属中的所有渲染都会绘制到一个纹理中,所以很容易调整普通的金属代码,使其适合于脱机呈现为一个电影文件。为重述核心记录过程:
AVAssetWriterAVAssetWriterInput类型的.video,以便您可以编写视频帧。AVAssetWriterInputPixelBufferAdaptor包在输入周围,这样您就可以将CVPixelBuffer作为帧附加到视频中。至于驱动记录,因为您没有收到来自MTKView或CADisplayLink的委托回调,所以您需要自己执行。基本模式如下所示:
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。
请注意,由于您没有实时运行,您需要确保任何动画都考虑到当前的帧时间(或帧间的时间步长),以便在播放时以适当的速度运行。在我的示例中,我通过让立方体的旋转直接依赖于框架的表示时间来做到这一点。
https://stackoverflow.com/questions/52789844
复制相似问题