video-streaming - 使用 3D 引擎输出作为流视频的输入

标签 video-streaming 3d

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

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

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

我想这有点像网络摄像头……但我希望“摄像头”能够“观察”在服务器上呈现的窗口的输出。

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

最佳答案

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

同时编码和流式传输

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

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

当然,服务器上运行的 3D 引擎必须具备渲染到 F4V/MP4 的能力,这可能需要为您的引擎定制导出插件。

表现

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

潜伏

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

客户端缓冲

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

HTTP 服务器支持

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

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

互动性

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

关于video-streaming - 使用 3D 引擎输出作为流视频的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7499068/

相关文章:

java - FFMPEG profile-level-id 大小无效

javascript - 如何提供动态更新的视频?

arrays - "Draw"3d 线到数组

javascript - 三.js : add BloomEffect from Post processing

java - 在 Java 中将视频帧保存为静态图像

android - 如何在 webRTC android 中将视频流数据记录为 mp4?

c# - 如何使用 C# 创建视频流

rglwidget : Cannot replace previous 3d plot

c++ - 三角剖分 3D 算法

three.js - 如何使用顶点在三个js中绘制多边形?