我正在尝试实现一个在Tomcat上运行的Java servlet,该Java servlet能够将多个FLV文件流传输到具有JWPlayer的客户端浏览器。问题是我必须一次流传输多个文件,有时需要从第一个剪辑的中间开始流传输,我需要JWPlayer认为文件持续时间就是所有剪辑组合的持续时间。
如果将所有剪辑合并到一个FLV文件中,然后注入元数据(使用yamdi),然后将其流式传输,则我的servlet可以很好地工作。但这可能会非常耗时。我尝试向播放器发送我首先从中间流式传输的文件的元信息,然后继续从中间流式传输它,但这似乎不起作用。我尝试摆弄元数据中的duration参数无济于事。
我认为这是因为当我从剪辑的中间开始流式传输时,我正在跳过标签。在servlet发送字节流之前,在处理字节流时构造标签是人为的吗?
最佳答案
除了初始FLV标头和单个帧描述之外,您不需要元数据。只要您的FLV帧正确且原子地启动和停止,对我来说,您正在做的事情就很有可能。 (我已经考虑过做类似的事情,已经编写了FLV解析器。)请确保不要发送Length头。 ;)两件事可能会使所有这些事情更容易实现:
确保您以较小的关键帧间隔对视频进行编码。您将无法以任何比这更高的分辨率在片段之间跳转。小于1s的任何问题都可能是有问题的,视频速率更高。
将您所有的视频文件预解析为片段。调用servlet时,
发送FLV标头
读取和写入整个段文件到客户端
1-切换视频,移至另一组片段文件
假设您要从头开始发送每个原始文件的示例:
send(FLV_HEADER)
i = 0
while(send file 1 condition == true)
send(file-1-segment i++)
i = 0
while(send file 2 condition == true)
send(file-2-segment i++)
(或者,您可以映射一些索引,并使用它们从文件的中间读取帧。在那做完。)