Устаревание MediaStream

Если вы работаете с getUserMedia() или WebRTC, вам может потребоваться настроить код для Chrome 45 и более поздних версий.

API MediaStream представляет синхронизированные потоки мультимедиа. Например, поток, поступающий со входа камеры и микрофона, синхронизирует видео и аудио дорожки. Каждая дорожка представлена ​​MediaStreamTrack . (Не путать с элементом <track> !)

В Chrome 45 есть три устаревших варианта MediaStream :

  • MediaStream.ended
  • MediaStream.label
  • MediaStream.stop()

Параллельно идут два дополнения:

  • MediaStream.active
  • MediaStreamTrack.stop()

Они требуют следующих изменений:

  • Используйте MediaStream.active , чтобы проверить, выполняется ли потоковая передача MediaStream , а не MediaStream.ended .
  • Используйте MediaStreamTrack.stop() для остановки потоковой передачи, а не MediaStream.stop() .
  • Если вам нужен уникальный идентификатор для MediaStream , используйте MediaStream.id вместо MediaStream.label . MediaStreamTrack.label предоставляет удобочитаемое имя исходного устройства для потока, например FaceTime HD Camera (встроенная) (05ac:8510) .

Вы можете увидеть это в действии: откройте simpl.info/gum в Chrome (на устройстве с камерой) и просмотрите консоль Chrome DevTools. stream объектов MediaStream, передаваемый обратному вызову getUserMedia() в этой демонстрации, находится в глобальной области видимости, поэтому вы можете проверить его с консоли. Вызовите stream.getTracks()[0] , чтобы просмотреть MediaStreamTrack для этого потока.

Снимок экрана, на котором показаны MediaStream и MediaStreamTrack в консоли Chrome DevTools.

Stop(), завершено и активно

Когда рабочая группа W3C по захвату и потокам мультимедиа рассмотрела проблему того, что происходит, когда вы добавляете новые дорожки в MediaStream , и завершается ли пустой MediaStream , они поняли, что не существует разумного способа реализовать ended в MediaStream (как в «никогда больше не начну»). В других частях HTML5 «окончание» означает «это закончилось и никогда не возобновится». «Активный» не имеет такого значения: неактивный поток может снова стать активным, например, если к нему добавляется новый трек. Вместо того, чтобы сохранять сбивающий с толку атрибут и функцию, Рабочая группа решила удалить его.

Вот пример использования MediaStream.active для проверки статуса потока:

var gumStream;

navigator.getUserMedia({audio: false, video: true},
    function(stream) {
            gumStream = stream;
        // ...
    },
    function(error) {
        console.log('getUserMedia() error', error);
    });

// …

if (gumStream.active) {
    // do something with the stream
}

Удаление stop() из MediaStream не привело к удалению какой-либо реальной функциональности: процессы отсоединения исходных устройств и т. д. в любом случае придется выполнять на MediaStreamTrack . Вместо этого используйте stop() в MediaStreamTrack :

navigator.getUserMedia({audio: false, video: true},
    function(stream) {
            // can also use getAudioTracks() or getVideoTracks()
        var track = stream.getTracks()[0];  // if only one media track
        // ...
        track.stop();
    },
    function(error){
        console.log('getUserMedia() error', error);
    });

этикетка

Оказывается, никто так и не смог придумать применение этому свойству!

MediaStream.label был добавлен в первую версию спецификации, но никто толком не знал, для чего нужна label . Также было неясно, что происходит с label при отправке потока через RTCPeerConnection .

Рабочая группа W3C поспрашивала , но никому это не нужно, поэтому они удалили его.

Еще раз повторим: MediaStream.id предоставляет уникальный идентификатор MediaStream , а MediaStreamTrack.label предоставляет имя источника потока, например тип камеры или микрофона.

Дополнительную информацию о MediaStream и MediaStreamTrack можно получить в сети разработчиков Mozilla , а HTML5 Rocks представляет собой отличное введение в getUserMedia() в разделе «Захват аудио и видео» .

Как всегда, мы ценим ваши отзывы об изменениях в Chrome. Вы можете следить за ошибками в этих устареваниях ( здесь и здесь ) и найти более подробное обсуждение и подробности в Намерении реализовать .