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

问题描述

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

渲染后,我想不知何故我需要将第一个纹理转换为 CVPixelBuffer。有点像 here 的描述方式,尽管这不太适合我的用例。

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

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

我可以帮助您入门吗?文档相当稀疏,我认为不清楚如何组合所有这些步骤。

解决方法

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

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

这是一个令人困惑的部分。 CVImageBufferCVPixelBuffer 只是 typealiasCVBufferes。

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