有趣的问题。有很多方面需要考虑,没有特别的顺序:
同时编码和流式传输
渲染影片的容器格式的选择非常重要。我认为主要的限制是渲染器被限制为顺序写入文件。原因是文件需要流式传输到客户端,因此当渲染器正在写入文件时,将有一个 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 Server 和QuickTime Broadcaster 流应用程序。对于 Adobe 方面来说,Adobe Streaming Server 是一个商业产品。 Microsoft 的另一个选项是用于 IIS 的 Smooth Streaming 服务器扩展。
交互性
您没有对此说任何话,但我认为这项技术的一个好的应用程序将允许客户端将输入事件发送回服务器,然后服务器将使用它来影响电影的内容。这实际上是一个完全托管在服务器上的游戏引擎,只有输入和显示组件在客户端上运行。再一次,这将具有挑战性,因为延迟足够低以使应用程序感觉响应。此外,您现在必须对每个客户端的流进行编码,因为每个客户端将看到不同版本的电影。这里有很多问题,可能需要渲染/编码场,具体取决于需要支持的同时客户端的数量。具有可组合的预渲染和预编码动画块(以旧 Dragon's Lair 游戏的风格)可能是此类应用程序的一个很好的折衷解决方案。