MediaStream 废弃

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

MediaStream API 表示同步的媒体流。例如,从摄像头和麦克风输入获取的数据流已同步视频和音频轨道。每个音轨都由一个 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.labelMediaStreamTrack.label 为视频流的来源设备提供直观易懂的名称,例如 FaceTime 高清摄像头(内置)(05ac:8510)

您可以查看实际操作:在 Chrome(在带有相机的设备上)打开 simpl.info/gum,然后查看 Chrome 开发者工具控制台。在本演示中,传递到 getUserMedia() 回调的 MediaStream 对象 stream 处于全局范围内,因此您可以从控制台对其进行检查。调用 stream.getTracks()[0] 即可查看此数据流的 MediaStreamTrack

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

Stop()、已结束且处于活动状态

媒体捕获和串流 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,并在实现意图中查看更多讨论内容和详细信息。