Descontinuações do MediaStream

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

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

Elas exigem as seguintes mudanças:

  • Use MediaStream.active para verificar se um MediaStream está sendo transmitido, não MediaStream.ended.
  • Use MediaStreamTrack.stop() para interromper o streaming, 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 um stream. Por exemplo: Câmera HD FaceTime (integrada) (05ac:8510).

Você pode ver esses recursos em ação: abra simpl.info/gum em Chrome (em um dispositivo com câmera) e acesse o console do Chrome DevTools. A O objeto stream do MediaStream transmitido ao callback getUserMedia() neste está no escopo global, então você pode inspecioná-la no console. Ligação stream.getTracks()[0] para ver o MediaStreamTrack deste stream.

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

Stop(), finalizado e ativo

Quando o grupo de trabalho W3C Captura de mídia e streams analisou o problema do que acontece quando você adiciona novas faixas a uma MediaStream, e, mesmo que uma MediaStream vazia seja finalizada, ela percebeu que não há uma maneira razoável de implementar ended em um MediaStream (como "nunca começará novamente"). Em outras partes do HTML5 "finalizado" significa que "isso terminou e nunca retomar". "Ativo" não tem essa implicação: um fluxo inativo pode ficar ativas novamente, por exemplo, se uma nova faixa for adicionada a ela. Em vez de manter um atributo e uma função confusos, o Grupo de trabalho decidiu removê-lo.

Este é um exemplo de como usar "MediaStream.active" para verificar o status de um 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: processos para desanexar dispositivos de origem e assim por diante precisam ser realizados MediaStreamTrack mesmo assim. 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 consegue descobrir uma utilidade para essa propriedade.

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

O grupo de trabalho W3C perguntou, e como ninguém queria, ele foi removido.

Para reiterar, MediaStream.id fornece um identificador exclusivo para uma MediaStream e MediaStreamTrack.label fornecem 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 do Mozilla Developer Network (em inglês) e O HTML5 Rocks fornece uma excelente introdução ao 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 (aqui e aqui) e encontre mais discussões e detalhes na Intent de implementação.