MediaStream のサポート終了

getUserMedia() または WebRTC を使用する場合は、Chrome 45 以降向けにコードの調整が必要になることがあります。

MediaStream API は、メディアの同期ストリームを表します。たとえば、カメラとマイク入力から取得したストリームでは、動画トラックと音声トラックが同期されます。各トラックは MediaStreamTrack で表されます。(<track> 要素とは異なります)。

Chrome 45 では、MediaStream が 3 つ非推奨となります。

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

それと並行して、次の 2 つも追加します。

  • MediaStream.active
  • MediaStreamTrack.stop()

これらには、次の変更が必要です。

  • MediaStream.active を使用して、MediaStream.ended ではなく MediaStream がストリーミングされているかどうかを確認します。
  • ストリーミングを停止するには、MediaStream.stop() ではなく MediaStreamTrack.stop() を使用します。
  • MediaStream の一意の識別子が必要な場合は、MediaStream.label ではなく MediaStream.id を使用します。MediaStreamTrack.label は、ストリームのソースデバイスの人が読める形式の名前を提供します(例: FaceTime HD Camera (Built-in) (05ac:8510))。

実際の動作を確認するには、カメラを搭載したデバイスで Chrome で simpl.info/gum を開き、Chrome DevTools コンソールを表示します。このデモで getUserMedia() コールバックに渡される MediaStream オブジェクト stream は、グローバル スコープ内にあるため、コンソールから検査できます。stream.getTracks()[0] を呼び出して、このストリームの MediaStreamTrack を表示します。

Chrome DevTools コンソールの MediaStream と MediaStreamTrack を示すスクリーンショット

Stop()、終了してアクティブ

メディア キャプチャとストリームの W3C ワーキング グループは、MediaStream に新しいトラックを追加したときにどうなるか、空の MediaStream が終了したかどうかという問題を検討したところ、MediaStreamended を実装する適切な方法がないことに気づきました(「二度とやり直すことはない」など)。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 Developer Network をご覧ください。また、HTML5 Rocks の音声と動画のキャプチャgetUserMedia() の概要を紹介しています。

Chrome の変更に関するアンケートにご協力いただきありがとうございました。非推奨のバグについては(こちらこちら)、実装の意図で詳細をご確認いただけます。