【问题标题】:Using 3D engine output as input to streaming video使用 3D 引擎输出作为流式视频的输入
【发布时间】:2011-09-21 11:36:57
【问题描述】:

进行流式传输到客户端设备的远程渲染(通常用于视频游戏)的想法在概念上非常简单,除非出现明显的问题,例如交互式快节奏游戏的延迟。

但是 - 从技术上讲,你怎么能做到呢?我的理解是流视频不仅缓存在当前播放位置之前,而且视频文件是通过向前看很多帧来压缩的?

是否有库可以让您将任意“显示提要”输入服务器端视频源,以便您可以使用常规 Flash/HTML5 组件在客户端上播放它?避免对自定义应用程序或定制浏览器插件的需求将是一个显着的好处......即客户端网页不知道它不是常规视频。

我想这有点像网络摄像头……但我希望“相机”能够“观看”渲染到服务器上的窗口的输出。

我的目标是基于 Windows 的服务器和 C++ 渲染应用程序。

【问题讨论】:

  • 您是否要进行远程渲染?为什么?您要解决的问题是什么?
  • 一个例子是为 iPad 或其他缺乏足够计算或渲染能力的平台进行渲染和物理模拟。我的目标是商业而非游戏市场。

标签: video-streaming 3d


【解决方案1】:

有趣的问题。有很多方面需要考虑,没有特别的顺序:

同时编码和流式传输

渲染影片的容器格式的选择非常重要。我认为主要的限制是渲染器被限制为顺序写入文件。原因是文件需要流式传输到客户端,因此当渲染器正在写入文件时,将有一个 Web 服务器进程在距离 EOF 很近的地方读取它。渲染器不能使用随机访问来写入电影文件,因为任何已经在磁盘上的数据都可能已经发送到客户端,所以很明显,写入磁盘的所有内容都必须是最终形式。

F4V 格式(Adobe FLV 的继承者)似乎符合要求,因为它可以以流媒体友好的方式编写。这种格式被客户端广泛支持,您只需要安装 Flash 播放器插件。对于 iPhone/iPad,您将需要另一种不涉及 Flash 的替代方案,因此对于 iOS,您可以使用 MP4。请注意,F4V 源自 MP4,两者非常相似。

当然,在服务器上运行的 3D 引擎必须能够渲染为 F4V/MP4,这可能需要为您的引擎提供自定义导出插件。

性能

您的服务器必须能够以与预期播放帧速率相同或更快的速度渲染和编码帧。硬件加速是您的朋友。

延迟

高效的视频编码格式只对帧之间的差异进行编码,因此要解码任何给定的帧,您可能需要先解码其他一些帧。现代编码格式最有趣的方面之一是它们不仅编码与过去帧的差异,还编码未来帧的差异。这显然会增加延迟,因为编码器需要推迟对帧进行编码,直到它接收到更多帧。似乎要减少延迟,您需要将编码的“未来”端限制在非常短的范围内,从而可能会降低编码效率和/或质量。

客户端缓冲

如果您想避免使用自定义播放插件,这可能会很困难。视频播放器将流下载到通常为几秒钟的缓冲区,并且仅在缓冲区已满时才开始播放。这里的想法是,完整的缓冲区有助于抵御任何网络中断和减速。但不幸的是,大缓冲区意味着延迟增加。您将需要找出客户端播放器希望在其播放缓冲区中拥有多少秒的素材,这将决定服务器端渲染/编码过程总是需要多远。自定义播放插件可以减少或消除缓冲区以减少延迟,但它对网络故障更加敏感。

HTTP 服务器支持

我不确定 HTTP 服务器希望如何流式传输文件,因为它是由另一个进程生成的。我怀疑这不是常规服务器测试或打算支持的东西。有一个不太为人所知的 FTP 扩展名为“tail-mode FTP”,它基本上使用您想要的行为。启用尾部模式的 FTP 服务器知道文件正在增长,因此它不假设大小,只传输文件中出现的字节。如果服务器发现文件消耗太快并达到 EOF,它甚至会等待文件增长。您可能需要支持类似功能的自定义 HTTP 服务器。

专用流媒体服务器在这里可能是一个不错的选择。感兴趣的链接是开源的Darwin Streaming ServerQuickTime Broadcaster 流应用程序。对于 Adob​​e 方面来说,Adobe Streaming Server 是一个商业产品。 Microsoft 的另一个选项是用于 IIS 的 Smooth Streaming 服务器扩展。

交互性

您没有对此说任何话,但我认为这项技术的一个好的应用程序将允许客户端将输入事件发送回服务器,然后服务器将使用它来影响电影的内容。这实际上是一个完全托管在服务器上的游戏引擎,只有输入和显示组件在客户端上运行。再一次,这将具有挑战性,因为延迟足够低以使应用程序感觉响应。此外,您现在必须对每个客户端的流进行编码,因为每个客户端将看到不同版本的电影。这里有很多问题,可能需要渲染/编码场,具体取决于需要支持的同时客户端的数量。具有可组合的预渲染和预编码动画块(以旧 Dragon's Lair 游戏的风格)可能是此类应用程序的一个很好的折衷解决方案。

【讨论】:

  • 非常有趣。首先,虽然这不是针对游戏的,但想法是相似的——用户与客户端(例如笔记本电脑)交互并在服务器上生成渲染/帧。这实际上是一个比玩 Quake 慢得多的环境,我猜第二个整体滞后并不太可怕。在插件等方面,避免使用自定义客户端插件是非常可取的,特别是因为 iPad 是强大的目标设备。我认为这与进行现场网络研讨会/网络广播非常相似,一个例子是 twitcast,除了我的 3D 引擎是输入,而不是网络摄像头。
  • 我了解避免使用客户端插件的必要性。我在 F4V 的推荐中没有考虑 iPhone/iPad,我很确定这些不会起作用,因为是与 Flash 播放器相关的格式。我正在更新我的答案以推荐 MP4,这是 Apple 所珍视的一种格式,实际上是 F4V 派生的原始格式。
  • 延迟方面,我认为客户端播放器需要缓存超过一秒,如果您使用常规客户端播放器而不是自定义播放器,我认为这将是一个很大的障碍。
  • @Miguel... 那么网络摄像头是如何工作的呢?例如,ChatRoulette 之类的网站似乎使用 Flash,并且不强制使用定制插件。直播电视也可以在常规浏览器上运行。插件并不是商业领域的世界末日,你可以强迫他们安装它,但它仍然不是最佳的,因为它意味着额外的工作。
  • Flash 一个插件。我的理解是,对于任何类型的流媒体解决方案,总会有一个浏览器插件形式的智能客户端。大多数实时网络摄像头都使用 Flash 小程序。 Apple 的 QuickTime 提供了一种类似的技术,他们已经为其开源了流媒体服务器(请参阅dss.macosforge.org)。在这种情况下,客户端是 QuickTime Player,它也是一个插件,预装在 iPhone/iPad 上。
【解决方案2】:

这个问题在软件中可能没有有效的解决方案……但在硬件中可能有:http://yhst-128017942510954.stores.yahoo.net/cube200-1ch-hdmi-enc2001.html

应该可以以更低的成本将该设备使用的 H.264 编码器与视频卡结合起来。

【讨论】:

  • 我认为这不是一个简单的解决方案 - 在多客户端情况下,您的服务器设施上需要大量它们 - 但这仍然非常有趣。
  • 考虑到如今构建硬件所需的资源,我认为如果您要寻求互联网规模的解决方案,它可能会更便宜。
  • 这当然是一条值得探索的途径。
【解决方案3】:

流编码视频

方法

我正在解决一个类似的问题,我会分享我学到的东西。虽然我不知道如何将它们流式传输出来,但我知道如何在服务器上生成和编码多个高清视频流。我测试了两种方法:NVIDIA CUDA Video Encode (C Library) API 和 Intel Performance Primitives Video Encoder。 NVIDIA 链接将您直接带到该示例。英特尔页面没有内部锚点,因此您必须搜索“视频编码器”。

测试设置

两者都将视频流(包括高清)编码为 H.264。支持其他格式,但我对 H.264 感兴趣。为了测试性能,我设置了准备好的 YUV 格式的输入视频,并以尽可能快的速度将其提供给编码器。两个编码器的输出均为 1080P。

CPU 性能

在性能方面,英特尔视频编码器可以在 Xeon E5520 @ 2.27GHz 上以大约 12.5% 的负载以 0.5 倍的实时速度对单个流进行编码,即 100% 负载下的一个 8 核。较新的 Xeon 速度要快得多,但我不知道它们是否可以实时运行。

GPU 性能

GTS 450 上的 NVIDIA 编码器可以在 50% 的 CPU 负载下编码 9-10X 实时 1080P(!)。 NVIDIA 上的 CPU 负载似乎主要是从 GPU 复制数据。

GPU 解决方案特别好的地方在于它可以将 GPU 渲染表面作为输入;图形在 GPU 上生成和编码,只留下到网络上。有关使用渲染表面和输入的详细信息,请参阅CUDA by Example,这是一本关于 GPU 编程的优秀且直截了当的书籍。在这种情况下,我预计 CPU 负载将下降大约一半。由于实时图形的速度比实时更快是没有意义的,因此您可以使用足够的 GPU 资源对来自渲染表面的 8+ 个流进行编码,例如两张 GTS 450 卡,如果分辨率低于 1080P 可以接受的话,可能会更多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2011-11-30
    • 2016-09-24
    • 2016-01-15
    相关资源
    最近更新 更多