MediaStream 废弃

如果您使用 getUserMedia() 或 WebRTC,则可能需要针对 Chrome 45 及更高版本调整代码。

MediaStream API 代表同步的媒体流。例如,从摄像头和麦克风输入获取的流包含同步的视频和音频轨道。每个轨道都由 MediaStreamTrack 表示。(请勿与 <track> 元素混淆!)

Chrome 45 中废弃了 3 个 MediaStream

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

并行添加了以下两项:

  • MediaStream.active
  • MediaStreamTrack.stop()

这需要进行以下更改:

  • 使用 MediaStream.active 检查 MediaStream 是否正在流式传输,而不是 MediaStream.ended
  • 使用 MediaStreamTrack.stop() 停止流式传输,而非 MediaStream.stop()
  • 如果您需要为 MediaStream 提供唯一标识符,请使用 MediaStream.id 而非 MediaStream.labelMediaStreamTrack.label 为数据流的来源设备提供人类可读的名称,例如 FaceTime HD 摄像头(内置)(05ac:8510)

您可以通过以下方式查看这些功能的运作方式:在 Chrome(搭载摄像头的设备)中打开 simpl.info/gum,然后查看 Chrome DevTools 控制台。在此演示中,传递给 getUserMedia() 回调的 MediaStream 对象 stream 处于全局范围内,因此您可以从控制台进行检查。调用 stream.getTracks()[0] 可查看此数据流的 MediaStreamTrack

显示 Chrome 开发者工具控制台中 MediaStream 和 MediaStreamTrack 的屏幕截图

Stop()、已结束和活跃

Media Capture and Streams W3C 工作组研究向 MediaStream 添加新轨道时会发生什么情况以及空 MediaStream 是否会结束时,他们意识到,没有合理的方法可以在 MediaStream 上实现 ended(即“永远不会再次启动”)。在 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
}

MediaStream 中移除 stop() 并未移除任何实际功能:无论如何,必须在 MediaStreamTrack 上执行与分离源设备等相关的进程。改为对 MediaStreamTrack 使用 stop()

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 的用途。此外,我们还不清楚通过 RTCPeerConnection 发送数据流时 label 会发生什么情况。

W3C 工作组四处打听,发现没有人需要它,因此将其移除了。

再次重申:MediaStream.idMediaStream 提供唯一标识符,MediaStreamTrack.label 提供数据流来源的名称,例如摄像头或麦克风的类型。

如需详细了解 MediaStreamMediaStreamTrack,请访问 Mozilla 开发者网络;HTML5 Rocks 在捕获音频和视频中提供了对 getUserMedia() 的极佳介绍。

一如既往,我们非常感谢您就 Chrome 的变更提供反馈。您可以关注这些废弃功能的 bug(此处此处),并在实施意向中找到更多讨论和详细信息。