video - 从流站点合并 .flv block

标签 video merge ffmpeg rtmp flv

我正在尝试从 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
  • 将单独的视频文件 (h264) 合并为一个大的 h264 视频文件。
  • 将单独的音频文件 (aac) 合并为一个大的 AAC 音频文件。
  • 在 FLV 或 MP4 容器中加入视频文件和音频文件。

  • 长版:

    问题是两个 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 .上面的图像是从中抓取的。
  • 在十六进制编辑器中打开两个 block
  • 在 Chunk-1 上只需 选择 (突出显示)& 删除 FLV header 的前 13 个字节(范围 0 到 12)。 header 以 46 开头在插槽 0 处,并以 00 结尾在插槽 12。
  • 下一个字节以 09 开头(视频帧)。看起来像 09 00 25 FF 00 17 etc etc
  • 您希望 Chunk-1 以上述字节而不是当前 46 4C 56 01 etc etc 开头
  • 最后...只是(“全选”和)所有 Chunk-1 字节和 粘贴 Chunk-0 末尾的那些字节。 保存 作为新的 FLV 并尝试播放。它会工作的!

  • 这是结果working FLV .

    关于video - 从流站点合并 .flv block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40895361/

    相关文章:

    c++ - 录制应用程序的音频输出

    c++ - 如何处理 RTMP 中的时间戳?

    asp.net - 从ffmpeg保存后打开jpg图像不起作用

    ruby - 使用两个数组创建哈希

    ffmpeg - 有没有办法使用 ffmpeg 和附带的编解码器 AAC 到 AAC 来精确获取 1 秒的剪辑

    ffmpeg - 使用ffmpeg垂直或水平堆叠(马赛克)几个视频?

    c# - 提取 .avi 文件的帧

    r - 我可以在不使用 merge() 函数的情况下使用 data.table 执行此操作吗?

    r - 连接两个数据表,仅使用第二个dt中的一列

    ffmpeg - 视频 HLS (m3u8) - 模拟本地连接速率?