10

我正在创建一个使用套接字将数据发送到其他设备的应用程序。我正在使用 Http 协议来发送和接收数据。现在的问题是,我必须流式传输视频,但我不知道如何发送视频(或流式传输视频)。

如果用户直接跳转到视频中间,那么我应该如何发送数据。

谢谢...

4

1 回答 1

18

HTTP 在设计时并没有真正考虑到流式传输。老实说,最好的协议是基于 UDP 的(SCTP在某些方面甚至更好,但支持很粗略)。但是,我很欣赏您可能受限于 HTTP,因此我将按书面形式回答您的问题。

我还应该指出,流媒体视频实际上是一个相当深奥的话题,我在这里所能做的就是尝试触及您可能想要研究的一些方法。如果您可以控制端到端解决方案,那么您可以做出一些选择 - 如果您只控制一端,那么您的选择或多或少取决于另一端可用的内容。

如果您只想从文件的开头播放,那么它相当简单 - 发出标准的 HTTP 请求并在缓冲足够的视频后立即开始播放,这样您就可以在赶上下载之前完成文件的下载速度。您不需要任何特殊的服务器支持,任何视频格式都可以使用。

寻找更棘手。您可以采用 YouTube 等网站过去采用的方法,即文件下载到足以到达视频中的那个点之前不允许用户搜索(或者让他们看着微调器直到达到那个点) . 然而,这并不是当今大多数人所期望的用户体验。

为了做得更好,您需要控制流媒体客户端。我建议将文件分块处理,并一次对一个块发出字节范围请求。当用户寻找文件中间时,您可以计算出文件中的字节偏移量并从该点开始发出字节范围请求。

如果视频格式在开始时包含某种索引,那么您可以使用它来计算文件偏移量 - 因此,您的视频客户端必须至少请求足够的索引才能进行任何搜索。

如果该格式没有任何形式的索引,但它以恒定比特率 (CBR) 编码,那么您可以执行初始HEAD请求并查看Content-Length标头以查找文件的大小。然后,如果用户在视频中寻找 40% 的路径,例如,您只需在编码帧中寻找 40% 的路径。这依赖于对文件格式的足够了解,以便您可以计算适当的搜索点,以便您可以识别帧信息等(或者至少是一种编码格式,即使您跳转也可以重新同步音频和视频流在文件中的任意位置)。这种方法也可能适用于可变比特率 (VBR),只要格式能够让您从任意搜索中恢复即可。

这并不理想,但正如我所说,HTTP 并不是真正为流媒体设计的。

如果您可以控制文件格式和服务器,则可以通过使每个块成为单独的资源来使生活更轻松。这就是Apple HTTP 实时流媒体Microsoft 平滑流媒体的工作方式。他们需要工具支持来预处理视频,我不知道你是否控制了服务器端。然而,可能值得研究。这些还做了更聪明的技巧,例如允许客户端在以不同比特率编码的多个版本的流之间切换,以应对带宽差异。

于 2013-01-16T09:24:25.893 回答