Descontinuações do MediaStream

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

A API MediaStream representa streams de mídia sincronizados. Por exemplo, um stream feito da entrada de câmera e microfone tem faixas de vídeo e áudio sincronizadas. Cada faixa é representada por uma 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()

Isso exige as seguintes mudanças:

  • Use MediaStream.active para verificar se um MediaStream está sendo transmitido, e não MediaStream.ended.
  • Use MediaStreamTrack.stop() para interromper o streaming, e não MediaStream.stop().
  • Se você precisar de um identificador exclusivo para um MediaStream, use MediaStream.id em vez de MediaStream.label. MediaStreamTrack.label fornece um nome legível por humanos para o dispositivo de origem de um stream, por exemplo, FaceTime HD Camera (Built-in) (05ac:8510).

Você pode conferir isso em ação: abra simpl.info/gum no Chrome (em um dispositivo com uma câmera) e confira o console do Chrome DevTools. O objeto MediaStream stream transmitido para o callback getUserMedia() nesta demonstração está no escopo global, para que você possa inspecionar no console. Chame stream.getTracks()[0] para conferir o MediaStreamTrack dessa transmissão.

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

Stop(), encerrada e ativa

Quando o grupo de trabalho do W3C Media Capture and Streams analisou o problema do que acontece quando você adiciona novas faixas a um MediaStream e se um MediaStream vazio é encerrado, eles perceberam que não havia nenhuma maneira sensata de implementar ended em um MediaStream (como em "nunca vai começar de novo"). Em outras partes do HTML5, "ended" significa "isso acabou e nunca será retomado". "Ativo" não tem essa implicação: um fluxo inativo pode voltar a ser ativo, 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 remover.

Confira um exemplo de como usar "MediaStream.active" para verificar o status de uma transmissão:

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 removeu nenhuma funcionalidade real: os processos para desconectar dispositivos de origem e assim por diante precisam ser feitos em 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);
    });

o rótulo.

Acontece que ninguém conseguiu descobrir um uso para essa propriedade.

MediaStream.label foi adicionado à primeira versão da especificação, mas ninguém sabia para que label servia. Também não estava claro o que acontecia com label quando um stream era enviado por RTCPeerConnection.

O Grupo de Trabalho do W3C perguntou, e ninguém queria, então ele foi removido.

Para reiterar: MediaStream.id fornece um identificador exclusivo para um 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 oferece uma excelente introdução a getUserMedia() em Captura de áudio e vídeo.

Como sempre, agradecemos seu feedback sobre as mudanças no Chrome. Acompanhe os bugs dessas descontinuações (neste link e neste link) e encontre mais discussões e detalhes na página Intent to Implement.