📹
Chrome M104で実装されるRegion Captureを試してみた
はじめに
Chrome M104のWebRTC関連のリリースノートに「Region Captureが使えるようになる」と書いてあると耳にしたので、Chrome Canary 105で試してみました。
Region Capture
Chromeをはじめとするモダンブラウザでは、画面共有の機能があります。
- navigator.mediaDevices.getDisplayMedia()
- 共有対象として、画面全体や、ウィンドウ、(Chromeの場合)ブラウザのタブが選択可能
タブを選択したときに特定の領域だけを切り抜いて共有するのが、今回のRegion Captureです。領域は座標で直接指定するのではなく、DOMエレメントを使って作成します。
サンプル
早速動きを見てみましょう。こちらにデモを用意しました。Chrome M104以降でアクセスしてください。(※2022年7月現在、Chrome安定版は103なので動きません)
- GitHub pages: https://mganeko.github.io/region_capture/
- ソース: https://github.com/mganeko/region_capture
操作方法
- Chrome M104以降で、https://mganeko.github.io/region_capture/ を開く
- [start capture]ボタンをクリック
- [現在のタブ/This Tab]を選択、表示されているタブのサムネイルをクリック
- [共有/Share]をクリック

- <div>に囲まれたテキスト、およびテキストエリアのみが共有され、上のビデオ要素に表示される
- テキストエリアを編集すると、その様子がビデオ要素にも反映される

- [stop capture]ボタンをクリックすると、共有が停止
使い方
ソースコード抜粋
    async function startCapture() {
      // 対象となるDOM要素(div)を取得、そこから領域を指定する CropTargetを生成
      const captureArea = document.querySelector('#caputre_area');
      const cropTarget = await CropTarget.fromElement(captureArea);
      // 画面共有(現在のタブを選択する)
      const stream = await navigator.mediaDevices.getDisplayMedia({
        preferCurrentTab: true,
      });
      // ビデオトラックを取得し、領域を切り取る
      const [videoTrack] = stream.getVideoTracks();
      await videoTrack.cropTo(cropTarget);
      // ビデオ要素で再生する
      localVideo.srcObject = stream;
      await localVideo.play();
      console.log('started');
    }
- DOM要素を指定し、CropTraget.formElement()で領域を取得
- Promiseを返すので、awaitで待つ
 
- navigator.mediaDevices.getDisplayMedia()で取得したVideoTrackを、cropTo()で切り抜く
注意点と特徴
- CropTraget.fromElement()に渡せるDOM要素には制限がある
- 現在は<div>と<iframe>のみOK
 
- 生成されたCropTargetはシリアライズ可能、postMessageでiframe等に渡せる
- cropTo()で切り出せるビデオトラックは、同じタブのビデオのみ(現在のところ)
- ターゲット領域がウィンドウ外に出ると、映像は取得されない
- 切り出した映像は、RTCPeerConnectionを使ってWebRTCで送信することが可能
終わりに
Region Captureを使うと、ブラウザのタブの一部だけを画面共有することができます。想定しているユースケースとしては、プレゼン時にスピーカーノートやチャットコメントを共有対象外にする、といった場面があるようです。
他のブラウザが追従するかは分かりませんが、なかなか面白い使い方ができそうです。
参考
- リリースノート:WebRTC M104 Release Notes
- Chrome公式記事とデモ:
- Region Captureの仕様:


Discussion