合并来自流站点的 .flv 块

Merging .flv chunks from stream site

我正在尝试从 Ustream 站点的替代版本下载视频。该站点显然用于 DRM 保护,事实上,您必须通过从该站点登录才能观看该视频。 视频系统应该与ustream使用的相同(相同的链接),即每隔x秒调用不同的flv块并将它们合并到流中(类似于rtmp服务,但它不使用此协议)。

我设法下载了组成该视频的每个 .flv 块,但在将它们合并为一个文件时遇到了问题。首先,这些 flvs 文件有一些 audio/video lags/problems,但由于没有其他方法可以下载此视频,我不会抱怨延迟。

真正的问题是每个 flv 文件的持续时间都会增加,尽管它的大小是正常的。视频时长约为 6 秒,因此第一个块长 6 秒,第二个块长 12 秒,尽管只有前 6 个可见(其余 6 个 "corrupted")。如果我尝试合并(使用 ffmpeg 或任何视频加入软件)所有这些文件(大约 600-700,总持续时间为 1 小时 15 分钟)只有前两个部分可见,那么我什么也看不到。 (更清楚的是,如果我尝试合并前 2 个块,文件长 18 秒,我可以看到前 12 个;如果我尝试合并前 3 个块,文件长 36 秒,我仍然只能看到前 12 秒。)

有人知道吗?

我检查了 FLV 块。时间戳实际上很好

简短版本:
Chunk-1 有一个不必要的 FLV header。删除它并将数据粘贴到 Chunk-0 的末尾。通过一些十六进制编辑器工具或编写一个基本实用程序来 auto-fix 每个文件用你的编码语言(PHP?Java?C++?你没有在你的问题中标记)。

为了避免代码,然后只使用 FFmpeg,尝试提取每个 FLV 块中包含的视频和音频部分。例如:

ffmpeg -i chunk1.flv -c:v copy chunk1.h264 //to get video 
ffmpeg -i chunk1.flv -c:a copy chunk1.aac //to get audio
  • 将单独的视频文件 (h264) 合并为一个大的 h264 视频文件。
  • 将单独的音频文件 (aac) 合并为一个大的 AAC 音频文件。
  • 将视频文件和音频文件合并到 FLV 或 MP4 容器中。

长版:

问题是两个块 每个 都有一个 FLV header(每个文件中的前 13 个字节)。
只有 Chunk-0 需要 header,因为 Chunk-1 只是视频的延续,它给出了接下来 6 秒的 FLV 文件。

为了形象化您的问题,让我们看看您的 FLV 的内部。如图所示,删除多余的字节后,你可以只粘贴剩余的Chunk-1字节在Chunk-0的末尾,然后re-save一个working FLV文件.

因此,只需使用您的编程语言编写具有简单逻辑的实用程序即可:

For each ascending chunk number that is not Chunk-0, delete its first 13 bytes and paste remaining at the end of Chunk-0.flv.

Repeat with each chunk until you have a large Chunk-0 FLV file of full duration.

作为测试,您可以使用免费的十六进制编辑器软件手动编辑块。在 Windows 上,我使用 HxD。以上图片都是从里面抓取的

  • 在十六进制编辑器中打开两个区块
  • 在 Chunk-1 上 select(突出显示)& 删除 FLV 的前 13 个字节 header(范围从 0 到 12)。 header 以插槽 0 处的 46 开头,并以插槽 12 处的 00 结尾。
  • 接下来的字节以 09(视频帧)开头。看起来像 09 00 25 FF 00 17 etc etc
  • 您希望 Chunk-1 以上述字节开始而不是当前 46 4C 56 01 etc etc
  • 最后...只是("Select All" 和)剪切 所有的 Chunk-1 字节并粘贴 那些字节在Chunk-0 结束。 保存 为新的 FLV 并尝试播放。它会起作用的!!

这是结果working FLV