1

我正在尝试将 1080p 视频聊天流嵌入到 Android 上的 Unity 应用程序中。

为此我尝试使用Agora.io,但当前版本的 Agora for Unity 完全在 CPU 上运行,并且在我的 Android 设备上将 1080p 纹理从 CPU 复制到 GPU 需要 20 毫秒 - 太慢而无法保持一致的 60fps 帧速率在我的应用程序中。理想情况下,我需要复制操作不阻塞渲染线程,或者我需要在 10 毫秒内完成复制,或者我需要完全在硬件中进行解码。

我已经深入研究了其他视频播放器应用程序是如何实现这一点的,通常它们使用 Android MediaCodec 或 ExoPlayer 将视频直接解码为硬件中的纹理。但是,这对于视频聊天应用程序来说似乎并不可行,因为将视频流编码为Android 支持的格式之一的过程会引入过多的延迟。

我很好奇 Skype 和 Hangouts 等应用程序是如何实现这一点的——但我怀疑它们要么以 30fps 运行,要么将视频分辨率限制在 720p 或更低。

我也考虑过创建我自己的视频聊天协议,使用像Basis 纹理压缩这样的东西来解压缩 GPU 而不是 CPU 上的纹理,但是关于如何将 Basis 编译和集成到 Android 应用程序中的信息很少。

所以我的问题是,有没有人知道视频聊天 SDK 可以提供这种性能和保真度而无需过多的开发工作?

4

1 回答 1

1

事实证明,我的分析是完全错误的。纹理复制根本不是问题——事实上,纹理解码和复制到 GPU 大约需要 3 毫秒,我的分析器只是报告了不正确的时间。

真正的瓶颈是我试图将图像渲染到 250K 的三角形表面上。事实证明,在正常情况下,我的 Android 设备只能使用 GLES 渲染 100K 三角形的表面。然而,在切换到 Vulkan 后,确保三角形有连接的边缘(大幅缩小网格索引缓冲区),并执行了一些小的网格优化,我能够将三角形预算增加到 400K,并在 1080p 30fps Agora 上实现稳定的 60fps 帧速率视频聊天流。

于 2020-06-19T07:56:27.970 回答