Descontinuações do MediaStream

Se você trabalha com getUserMedia() ou WebRTC, talvez seja necessário ajustar seu código para o Chrome 45 e posterior.

A API MediaStream representa fluxos de mídia sincronizados. Por exemplo, um stream extraído da entrada de câmera e microfone tem faixas de vídeo e áudio sincronizadas. Cada faixa é representada por um MediaStreamTrack. Não confunda com o elemento <track>.

Há três descontinuações de MediaStream no Chrome 45:

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

Em paralelo, há duas adições:

  • MediaStream.active
  • MediaStreamTrack.stop()

Eles exigem as seguintes mudanças:

  • Use MediaStream.active para verificar se um MediaStream está fazendo streaming, não MediaStream.ended.
  • Use MediaStreamTrack.stop() para interromper a transmissão, não MediaStream.stop().
  • Se você precisar de um identificador exclusivo para uma MediaStream, use MediaStream.id em vez de MediaStream.label. MediaStreamTrack.label fornece um nome legível para o dispositivo de origem de uma transmissão, por exemplo, Câmera FaceTime HD (integrada) (05ac:8510).

Confira como isso funciona: abra simpl.info/gum no Chrome (em um dispositivo com uma câmera) e acesse o console do Chrome DevTools. O objeto stream do MediaStream transmitido para o callback getUserMedia() nesta demonstração está no escopo global. Portanto, você pode inspecioná-lo no console. Chame stream.getTracks()[0] para visualizar o MediaStreamTrack desse stream.

Captura de tela mostrando o MediaStream e o MediaStreamTrack no console do Chrome DevTools

Stop(), finalizado e ativo

Quando o grupo de trabalho do W3C de captura de mídia e streams analisou o problema do que acontece quando você adiciona novas faixas a um MediaStream, e se um MediaStream vazio era encerrado, eles perceberam que não havia uma maneira sensata de implementar ended em um MediaStream (como em "nunca vai começar novamente"). Em outras partes do HTML5, "finalizado" significa que "foi encerrado e nunca será retomado". "Ativo" não tem essa implicação: um fluxo inativo pode ficar ativo novamente, por exemplo, se uma nova faixa for adicionada a ele. Em vez de manter um atributo e uma função confusos, o grupo de trabalho decidiu removê-los.

Confira um exemplo de como usar "MediaStream.active" para verificar o status de um stream:

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
}

A remoção de stop() de MediaStream não removia nenhuma funcionalidade real: os processos para remover dispositivos de origem e assim por diante precisam ser feitos no MediaStreamTrack de qualquer maneira. Use stop() em 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);
    });

Rótulo

Ninguém conseguiu descobrir um uso para essa propriedade.

MediaStream.label tinha sido adicionado à primeira versão da especificação, mas ninguém sabia para que serve label. Também não ficou claro o que acontecia com label quando um stream era enviado via RTCPeerConnection.

O grupo de trabalho do W3C perguntou por aí, e ninguém queria a plataforma, então a remoção foi feita.

Para reiterar: MediaStream.id fornece um identificador exclusivo para uma MediaStream, e MediaStreamTrack.label fornece o nome da origem de um stream, como o tipo de câmera ou microfone.

Mais informações sobre MediaStream e MediaStreamTrack estão disponíveis na Mozilla Developer Network, e o HTML5 Rocks fornece uma excelente introdução a getUserMedia() em Como capturar áudio e vídeo.

Como sempre, agradecemos seu feedback sobre as alterações no Chrome. Confira os bugs dessas descontinuações (neste link e neste link) e encontre mais detalhes e discussões em Intent de implementação.