将多个FLV文件作为单个文件通过Java servlet进行流式传输

时间:2011-04-07 16:19:33

标签: java servlets streaming flv

我正在尝试实现在Tomcat上运行的Java servlet,它能够将多个FLV文件流式传输到具有JWPlayer的客户端浏览器。问题是我必须一次流式传输多个文件,有时从第一个剪辑的中间开始流式传输,我需要JWPlayer认为文件持续时间是所有剪辑组合的持续时间。

如果我将所有剪辑合并到一个FLV文件中,注入元数据(使用yamdi)然后对其进行流式传输,那么我的servlet会运行良好。但这可能非常耗时。我已经尝试向播放器发送我从中间首先流式传输的文件的元信息,然后继续从中间流式传输,但这似乎不起作用。我试图摆弄元数据中的duration参数无济于事。

我认为这是因为当我从剪辑中间开始流式传输时,我正在跳过标签。在servlet发送字节流之前处理字节流时,是否有可能构造标记?

1 个答案:

答案 0 :(得分:0)

除了初始FLV标头和单独的帧描述之外,您不需要元数据。只要您的FLV帧正确且原子地启动和停止,您正在做的事情对我来说似乎是非常可能的。 (我考虑过做类似的事情,已经编写了一个FLV解析器。)一定不要发送一个Length头。 ;)有两件事可能会让所有这些更容易实现:

  1. 确保您使用较小的关键帧间隔对视频进行了编码。您将无法以比此更精细的分辨率在剪辑之间跳转。任何少于1s的东西都可能会出现问题,视频速率会更高。
  2. 将您的所有视频文件预先解析为细分。调用servlet时
    1. 发送FLV标题
    2. 读取并将整段文件写入客户端 1-切换视频,移动到另一组段文件
  3. 假设您想要从头开始发送每个原始文件的示例:

    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++)
    

    (或者你可以映射一些索引并使用它们从文件中间读取帧。就在那里,完成它。)