我正在尝试从 Ustream 网站的替代版本下载视频。该站点显然用于 DRM 保护,实际上您无法通过从该站点登录访问该视频来观看该视频。
视频系统应该与 ustream 使用的相同(相同的链接),即每 x 秒调用不同的 flv block 并将它们合并到流中(类似于 rtmp 服务,但它不使用此协议(protocol))。
我设法下载了组成这个视频的每个 .flv block ,但我在将它们合并到一个文件时遇到了问题。首先,这些 flvs 文件有一些音频/视频滞后/问题,但由于没有其他方法可以下载此视频,我并不提示滞后。
真正的问题是每个 flv 文件的持续时间都会增加,尽管它们的大小是正常的。视频持续时间约为 6 秒,因此第一个 block 为 6 秒长,第二个 block 为 12 秒长,尽管只有前 6 个可见(其余 6 个已“损坏”)。如果我尝试合并(使用 ffmpeg 或任何视频加入软件)所有这些文件(大约 600-700 个,总持续时间为 1 小时 15 分钟)只有前两个部分可见,那么我什么也看不到。 (更清楚一点,如果我尝试合并前 2 个 block ,文件长 18 秒,我可以看到前 12 个;如果我尝试合并前 3 个 block ,文件长 36 秒,我仍然只能看到前 12 秒。)
有人有什么想法吗?
最佳答案
我检查了 FLV block 。时间戳为 其实还好 .
短版: Chunk-1 有一个不必要的 FLV header 。删除它并将数据粘贴到 Chunk-0 的末尾。通过一些十六进制编辑器工具或编写一个基本实用程序来自动修复您的编码语言中的每个文件(PHP?Java?C++?你没有在你的问题中标记)。
为避免代码,然后仅使用 FFmpeg,请尝试提取每个 FLV block 中包含的视频和音频部分。例如:
ffmpeg -i chunk1.flv -c:v copy chunk1.h264 //to get video
ffmpeg -i chunk1.flv -c:a copy chunk1.aac //to get audio
长版:
问题是两个 block 每个 有一个 FLV header (每个文件中的前 13 个字节)。只有 Chunk-0 需要 header ,因为 Chunk-1 只是视频的延续,它提供接下来 6 秒的 FLV 文件。
为了可视化您的问题,让我们看看您的 FLV 的内部。如图所示,删除多余字节后,只需粘贴 Chunk-0 末尾的剩余 Chunk-1 字节,然后重新保存为 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.
作为测试,您可以使用免费的十六进制编辑器软件一起手动编辑 block 。在 Windows 上,我使用 HxD .上面的图像是从中抓取的。
46
开头在插槽 0 处,并以 00
结尾在插槽 12。09
开头(视频帧)。看起来像 09 00 25 FF 00 17 etc etc
46 4C 56 01 etc etc
开头这是结果working FLV .
关于video - 从流站点合并 .flv block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40895361/