我正在创建一个应用程序,它使用套接字将数据发送到其他设备。我正在使用 Http 协议(protocol)来发送和接收数据。现在的问题是,我必须流式传输视频,但我不知道如何发送视频(或流式传输视频)。
如果用户直接跳到视频中间,我应该如何发送数据。
谢谢...
最佳答案
HTTP 在设计时并没有真正考虑到流式传输。老实说,最好的协议(protocol)是基于 UDP 的协议(protocol)(SCTP 在某些方面甚至更好,但支持很粗略)。不过,您可能受限于 HTTP,因此我将按书面形式回答您的问题。
我还应该指出,流式视频实际上是一个很深的话题,我在这里所能做的就是尝试触及一些您可能想要研究的方法。如果您可以控制端到端解决方案,那么您就可以做出一些选择 - 如果您只控制一端,那么您的选择或多或少取决于另一端的可用情况。
如果您只想从文件的开头开始播放,那么这非常简单 - 发出一个标准的 HTTP 请求,一旦缓冲了足够的视频就可以开始播放,这样您就可以在 catch 之前完成文件的下载与您的下载速度。您不需要任何特殊的服务器支持,任何视频格式都可以。
寻找更棘手。您可以采用像 YouTube 这样的网站曾经采用的方法,即在文件下载量足以达到视频中的那个点之前,不允许用户进行搜索(或者只是让他们看着微调器,直到达到该点)。然而,这并不是当今大多数人所期望的用户体验。
要做得更好,您需要控制流媒体客户端。我建议将文件分块处理并制作 byte range requests一次一 block 。当用户在文件中间查找时,您可以计算出文件中的字节偏移量并从该点开始发出字节范围请求。
如果视频格式在开头包含某种索引,那么您可以使用它来计算文件偏移量 - 因此,您的视频客户端在进行任何搜索之前必须至少请求足够的索引以获取索引。
如果格式没有任何形式的索引,但它以恒定比特率 (CBR) 编码,那么您可以执行初始 HEAD
请求并查看 Content-Length
header 来查找文件的大小。然后,如果用户在视频中寻找 40% 的路径,例如,您只需在编码帧中寻找 40% 的路径。这依赖于对文件格式的足够了解,您可以计算出一个合适的搜索点,以便您可以识别帧信息等(或者至少是一种编码格式,即使您跳转也可以让您与音频和视频流重新同步在文件中的任意点)。这种方法也适用于可变比特率 (VBR),只要格式是您可以从任意搜索中恢复即可。
这并不理想,但正如我所说,HTTP 并不是真正为流式传输而设计的。
如果您可以控制文件格式和服务器,则可以通过将每个 block 作为单独的资源来简化工作。这是如何Apple HTTP live streaming和 Microsoft smooth streaming两者都有效。他们需要工具支持来预处理视频,我不知道你是否控制了服务器端。然而,可能值得研究。这些也有更多巧妙的技巧,例如允许客户端在以不同比特率编码的多个流版本之间切换,以应对带宽差异。
关于http - 如何使用 HTTP 协议(protocol)发送视频 block 进行流式传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14352599/