ちょっと細かい話となってしまいますが、知っておいて損はないと思いますので投稿しました。
MediaDeviceのdeviceIdは固定(不変)
navigator.mediaDevices.enumrateDevices()で取得されるカメラやマイクといった外部デバイス(MediaDevice)のdeviceIdは不変なもので、ブラウザーのリロードや再起動、またはシステムを再起動しても、デバイスごとに同じdeviceIdが割り振られます。
DesktopMediaのstreamIdは動的(1回のみgUM()可能)
それに対して、Chrome拡張機能のAPIであるchooseDesktopMedia()で取得されるstreamIdは、chooseDesktopMedia()実行するごとに同じスクリーンやウィンドウを選択したとしても違う値が割り振られ、また、1回getUserMedia()でストリームを取得したら、2回目以降同じstreamIdでgetUserMedia()でストリームを取得しようとしてもできません。
Firefoxのスクリーンキャプチャーでは?
そもそも、deviceIdやstreamIdといったものが実装上において扱うことがありません。また、取得されたストリームのvideoトラックからgetConstraints()を実行しても、deviceIdは空のオブジェクトとなります。(chromeのchooseDesktopMedia()ではgetConstraints()で、deviceIdプロパティでstreamIdが取得できる)
ちなみにScreen Capture APIでは
現在、Screen Capture APIの仕様が標準化に向けて策定中ですが、Firefoxのスクリーンキャプチャーに近いものとなっており、deviceIdについても策定中の仕様において言及されており、deviceIdは利用者側では扱わないよう策定されています。
仕様のdevice-identifiersの項目
つまり
ユーザーが選択したカメラやマイクを保持しておけば、リロードや再起動されたとしても(ユーザーの操作なしに)即座に前の状態に復帰させることが可能ですが、スクリーンキャプチャーの場合は、リロードや再起動するごとに、再度、ユーザーに選択させなければなりません。
たぶん、セキュリティー上このような仕様となっているのだと思います。