API источника мультимедиа — автоматически обеспечивает плавное воспроизведение сегментов мультимедиа в порядке добавления.

HTML-элементы аудио и видео позволяют загружать, декодировать и воспроизводить мультимедиа, просто указав URL-адрес src:

    <video src='foo.webm'></video>

Это хорошо работает в простых случаях использования, но для таких методов, как адаптивная потоковая передача , API расширений источника мультимедиа (MSE) обеспечивает больший контроль. MSE позволяет создавать потоки в JavaScript из сегментов аудио или видео.

Вы можете попробовать MSE по адресу simpl.info/mse :

Скриншот видео, воспроизводимого с помощью MSE API.

Код ниже взят из этого примера.

MediaSource представляет собой источник мультимедиа для аудио- или видеоэлемента. После создания экземпляра объекта MediaSource и срабатывания его события open к нему можно добавить SourceBuffer . Они действуют как буферы для медиа-сегментов:

var mediaSource = new MediaSource();
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function() {
    var sourceBuffer =
        mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
    // Get video segments and append them to sourceBuffer.
}

Медиа-сегменты «передаются в потоковом режиме» к аудио- или видеоэлементу путем добавления каждого сегмента в SourceBuffer с помощью appendBuffer() . В этом примере видео извлекается с сервера, а затем сохраняется с помощью API-интерфейсов файлов:

reader.onload = function (e) {
    sourceBuffer.appendBuffer(new Uint8Array(e.target.result));
    if (i === NUM_CHUNKS - 1) {
    mediaSource.endOfStream();
    } else {
    if (video.paused) {
        // start playing after first chunk is appended
        video.play();
    }
    readChunk(++i);
    }
};

Установка порядка воспроизведения

В Chrome 50 добавлена ​​дополнительная поддержка атрибута mode SourceBuffer , позволяющая указать, что медиасегменты воспроизводятся непрерывно, в том порядке, в котором они были добавлены, независимо от того, имели ли медиасегменты изначально прерывистые временные метки.

Используйте атрибут mode , чтобы указать порядок воспроизведения медиа-сегментов. Он имеет одно из двух значений:

  • сегменты : временная метка каждого сегмента (которая может быть изменена с помощью timestampOffset ) определяет порядок воспроизведения, независимо от порядка, в котором сегменты добавляются.
  • последовательность : Порядок сегментов, буферизуемых на временной шкале мультимедиа, определяется порядком, в котором сегменты добавляются в SourceBuffer .

Если медиа-сегменты имеют временные метки, анализируемые из данных байтового потока, когда они добавляются в SourceBuffer , свойство mode SourceBuffer будет установлено в сегменты . В противном случае mode будет установлен на последовательность . Обратите внимание, что метки времени не являются обязательными: они должны присутствовать для большинства типов потоков и не могут присутствовать для других: внутриполосные метки времени являются неотъемлемой частью типов потоков, которые их содержат.

Установка атрибута mode не является обязательной. Для потоков, которые не содержат временных меток (аудио/mpeg и аудио/aac), mode можно изменить только с сегментов на последовательность : будет выдана ошибка, если вы попытаетесь изменить mode с последовательности на сегменты . Для потоков, имеющих временные метки, можно переключаться между сегментами и последовательностями , хотя на практике это, вероятно, приведет к нежелательному, труднопонятному или труднопредсказуемому поведению.

Для всех типов потоков вы можете изменить значение с сегментов на последовательность . Это означает, что сегменты будут воспроизводиться в том порядке, в котором они были добавлены, и соответственно генерируются новые временные метки:

sourceBuffer.mode = 'sequence';

Возможность установить значение mode для последовательности обеспечивает непрерывное воспроизведение мультимедиа, независимо от того, были ли временные метки медиасегментов прерывистыми — например, если были проблемы с мультиплексированием видео или если (по какой-либо причине) добавлялись прерывистые сегменты. Приложение может заполнить полифил с timestampOffset , чтобы обеспечить непрерывное воспроизведение, если доступны правильные метаданные потока, но режим последовательности делает процесс более простым и менее подверженным ошибкам.

Приложения и демо-версии MSE

На них показан MSE в действии, но без манипуляций SourceBuffer.mode :

Поддержка браузера

  • Chrome 50 и выше по умолчанию
  • Для Firefox подробности см. в MDN .

Спецификация

Информация об API