我正在尝试从多个来源并行实现视频下载。但是,当不遵循视频文件的顺序时,MSE appendBuffer方法总是失败。
我想以随机顺序追加部分并尽快播放视频""。 我正在探索SourceBuffer模式属性以及timestampOffset。这些都没有帮助。
我想知道我的源webm文件是否可以是"不支持的格式"对于这样的任务(顺序方法工作正常)。
感谢您的任何建议。
更新 我试图分析众所周知的example video file,并且我发现有可能无序地附加它的一部分。似乎有必要遵循群集字节范围:
<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>
答案 0 :(得分:3)
在深入研究webm格式规范后,编译libwebm工具并研究DASH i 最终想出了如何让MSE appendBuffer以任何顺序工作!
你会得到像stdout这样的东西:
{
"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");
,然后加载 ANY ORDER 所有其他细分。例如。第二段范围是55019-221449
字节。
说明:
最重要的是 ffmpeg 重新编码,一组帧设置为您希望拥有的群集大小。在此示例中,我选择相当低的阈值(每10帧),但您可以选择更高的,从而导致生成的群集更少(“媒体”数组中的项目更少。)
之后你必须以经典的方式修复 cues (使用来自 libwebm 的 sample_muxer ),你就可以开始了。
经过测试:Chrome 51,Firefox 47。