1

我正在尝试从多个来源并行下载视频。但是,当不遵循视频文件的顺序时,MSE appendBuffer 方法总是失败。

我想以随机顺序附加部分并“尽快”播放视频。我正在探索 SourceBuffer 模式属性以及 timestampOffset。这些都没有帮助。

我想知道对于这样的任务,我拥有的源 webm 文件是否可能是“不支持的格式”(顺序方法工作正常)。

源视频文件

感谢您的任何建议。

更新: 我试图分析众所周知的示例视频文件,我发现可能会乱序附加部分内容。似乎有必要遵循集群字节范围

<Cluster type="list" offset="4357">
  <Timecode type="uint" value="0"/>
  <SimpleBlock type="binary" size="7723" trackNum="1" timecode="0" presentationTimecode="0" flags="80"/>
  <SimpleBlock type="binary" size="5" trackNum="2" timecode="0" presentationTimecode="0" flags="80"/>
  ...
</Cluster>
<Cluster type="list" offset="16187">
  <Timecode type="uint" value="385"/>
  <SimpleBlock type="binary" size="5" trackNum="2" timecode="0" presentationTimecode="385" flags="80"/>
  <SimpleBlock type="binary" size="4968" trackNum="1" timecode="13" presentationTimecode="398" flags="80"/>
  ...
</Cluster>
4

1 回答 1

6

在深入研究了 webm 格式规范、编译 libwebm 工具并研究了 DASH 之后,我终于弄清楚了如何让 MSE appendBuffer 以任意顺序工作!

  1. ffmpeg -i result.webm -g 10 -c:v libvpx resultClusters.webm(也可以使用libvpx-vp9)
  2. mkvmuxer_sample -i resultClusters.webm -o resultRepaired.webm
  3. mse_json_manifest resultRepaired.webm >> manifest.json

你会在标准输出上得到类似的东西:

{
  "type": "video/webm; codecs=\"vp8\"",
  "duration": 27771.000000,
  "init": { "offset": 0, "size": 258},
  "media": [
    { "offset": 258, "size": 54761, "timecode": 0.000000 },
    { "offset": 55019, "size": 166431, "timecode": 2.048000 },
    { "offset": 221450, "size": 49258, "timecode": 4.130000 },
    { "offset": 270708, "size": 29677, "timecode": 6.148000 },
    { "offset": 300385, "size": 219929, "timecode": 8.232000 },
    { "offset": 520314, "size": 25132, "timecode": 10.335000 },
    { "offset": 545446, "size": 180777, "timecode": 12.440000 },
    { "offset": 726223, "size": 76107, "timecode": 14.471000 },
    { "offset": 802330, "size": 376557, "timecode": 14.794000 },
    { "offset": 1178887, "size": 247138, "timecode": 16.877000 },
    { "offset": 1426025, "size": 78468, "timecode": 18.915000 },
    { "offset": 1504493, "size": 25614, "timecode": 20.991000 },
    { "offset": 1530107, "size": 368277, "timecode": 23.093000 },
    { "offset": 1898384, "size": 382847, "timecode": 25.097000 },
    { "offset": 2281231, "size": 10808, "timecode": 27.135000 }
  ]
}

现在您所要做的就是首先加载元数据xhr.setRequestHeader("Range", "bytes=0-257");,然后以任何顺序加载所有其他段。例如,第二段范围是55019-221449字节。

解释:

最重要的是ffmpeg重新编码,将一组帧设置为您想要的集群大小。在此示例中,我选择了相当低的阈值(每 10 帧),但您可以选择更高的阈值,从而生成更少的集群(“媒体”数组中的项目更少)。

之后,您必须以经典方式(使用来自 libwebm 的sample_muxer )修复提示,然后您就可以开始了。

测试:Chrome 51、Firefox 47。

于 2016-06-16T10:25:26.820 回答