【问题标题】:What is the most efficient way to render a streamed video in SceneKit iOS?在 SceneKit iOS 中渲染流式视频的最有效方法是什么?
【发布时间】:2020-07-24 10:22:46
【问题描述】:

我正在开发一个显示流式视频的 SceneKit 应用。在其中我创建了一个平面,将 UIImage 附加到它,然后保存 CALayer。后来,我得到一个压缩的视频流,我把它解压成一个 CGImage。然后我用新的 CGImage 更新 CALayer 的内容。这一切都有效,但是帧速率很慢,而且似乎不是流式传输或解压缩问题。

我的问题是:有没有更快、更有效的方法来做到这一点?我已经对 SCNPlane 进行了旋转和偏移转换。但是,这些应该只是矩阵更新,不应更改渲染时间,因为您必须通过相同的矩阵才能在其原始坐标中渲染 SCNPlane。

【问题讨论】:

    标签: ios swift sprite-kit video-streaming scenekit


    【解决方案1】:

    转换为UIImageCGImageRef 是一项代价高昂的操作。它以非最佳格式创建图像的 CPU 表示,然后需要再次转换为 GPU 表示 (MTLTexture)。 SceneKit 支持将AVPlayer 实例作为材质属性的contents。这应该是将视频映射到飞机上的最简单、最有效的方法。

    更新: 如果您的应用程序管道是围绕CVImageBufferRef(又名CVPixelBufferRef)构建的,那么CVMetalTextureCacheCVMetalTextureCacheCreateTextureFromImage 是您应该利用的API 来有效地生成MTLTexture 实例以设置为材料属性的contents

    【讨论】:

    • 深入挖掘... 视频解压缩器正在生成一个 CVPixelBuffer 流,我通过 VTCreateCGImageFromCVPixelBuffer 将其转换为 CGImageRef。我不认为我可以将像素缓冲区直接输入 AVPlayer。
    猜你喜欢
    • 2011-08-05
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多