【问题标题】:Is there a way to stream a Metal Texture to Youtube on iOS?有没有办法在 iOS 上将 Metal Texture 流式传输到 Youtube?
【发布时间】:2021-08-31 19:56:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios video-streaming metal video-toolbox


    【解决方案1】:

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

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

    这里有一部分让人非常困惑。 CVImageBufferCVPixelBuffer 只是 typealiases 对应于 CVBuffer

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

    【讨论】:

    • 谢谢。这当然很复杂——听起来我可能一次需要多个金属纹理来处理多个相应的缓冲帧,或者......?
    • 是的,我想是的。据我了解,CMSampleBuffers 可能有点“乱序”——这意味着它们稍后将使用您提供的时间戳重新组合成实际的视频流。您可能想要一个纹理池,基本上就像视频解码作品一样,您可以在其中显示多余的“帧”,即使现在还不是时候。希望我能更具体一些,但我还没有使用过那个特定的 API。
    • 哎呀。我不认为普通的 youtube 会员可以在没有 Replaykit 的情况下进行流式传输,所以我想知道是否有其他服务的非 Replaykit 方法。在没有示例代码的情况下完成这一切是很有挑战性的。我的理解是它涉及使用 videotoolbox,即使那样我也必须弄清楚如何将纹理压缩成可流式传输的视频。我觉得奇怪的是没有自动的方法可以通过一些 api 来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2018-02-09
    • 2011-07-17
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多