2016-06-13 9 views
1

Я пытаюсь добиться загрузки видео параллельно из нескольких источников. Однако метод MSE appendBuffer всегда терпит неудачу, если не соответствует порядку последовательности видеофайлов.Расширения источника мультимедиа appendBuffer потока WebM в случайном порядке

Я хотел бы добавить детали в произвольном порядке и воспроизвести видео «как можно скорее». Я изучал свойство режима SourceBuffer, а также timestampOffset. Ни один из них не помог.

Мне интересно, может ли исходный файл веб-сайта быть в «не поддерживаемом формате» для такой задачи (последовательный подход работает отлично).

source video file

Спасибо за любые советы.

UPDATE: Я попытался проанализировать хорошо известным 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> 

ответ

2

После копания в WebM спецификации формата, составление libwebm инструментов и изучения DASH я , наконец, понял, как сделать MSE appendBuffer работать в любом порядке!

  1. FFmpeg -i result.webm -g 10 -c: v libvpx resultClusters.webm (вы также можете использовать libvpx-vp9)
  2. sample_muxer -i resultClusters.webm -o resultRepaired.webm
  3. mse_json_manifest resultRepaired.webm

вы получите на стандартный вывод что-то вроде:

{ 
    "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 кадров), но вы можете выбрать более высокий , вызывая меньше кластеров, (меньше элементов в массиве «media»).

После этого вы должны исправить сигналы классическим способом (с использованием sample_muxer из libwebm), и вы готовы пойти.

Протестировано: Chrome 51, Firefox 47.