有没有办法在 iOS 上将金属纹理流式传输到 Youtube?

Is there a way to stream a Metal Texture to Youtube on iOS?

我在这里 https://developer.apple.com/videos/play/wwdc2018/601/ 研究了 replaykit,并且想知道是否可以将 Metal renderpass 的结果流式传输到 youtube。用例涉及为用户提供观众不应该看到的额外视觉效果。所以我会首先只渲染我的图形场景的共享部分,将其流式传输到 youtube,然后完成渲染仅限用户的内容。如果 replaykit 不接受自定义视频,我认为这也需要 VideoToolbox,这会令人失望。我试图避免编写自己的网络代码。

渲染后,我想我需要以某种方式将第一个纹理转换为 CVPixelBuffer。它描述的方式有点像 here 虽然这不太适合我的用例。

这就是我迷路的地方。我想我可能还需要复制像素缓冲区,因为它可能在 Metal 渲染帧后被覆盖。

在某处插入一些 BlitEncoder 的使用。

我可以开始使用吗?文档相当稀疏,我认为不清楚如何组合所有这些步骤。

查看 API,我认为流式传输任意内容是不可能的,至少不能直接流式传输。

API 强制您录制整个屏幕(同时提示用户是否真的想要这样做)。但是您可以 post 之后使用传递给 startCapture method 的处理程序对其进行处理。但是,在该处理程序中,您可以访问 CMSampleBuffer,如果它是 RPSampleBufferType.video,那么您可以获取 MTLTexture 以获得正确的时间戳并基本上绘制到其中。

这里有一个部分非常令人困惑。 CVImageBufferCVPixelBuffer 只是 typealias 用于 CVBuffer

要绘制到 CMSampleBuffer,您可以使用 属性 imageBufferCMSampleBuffer 抓取 CVImageBuffer,然后 CVPixelBufferLockBaseAddress 然后然后你基本上在内存中有一个线性位图。从那里,您只需要想出一种方法,使用正确的格式将 MTLTexture 写入此线性内存,解锁 CVPixelBuffer 的基地址,然后继续下一个。