chrome使用视频设备

69 阅读1分钟
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style></style>
  </head>
  <body>
    <video id="video" autoplay autoPictureInPicture width="0" height="0"></video>
    <button id="button">点击</button>
    <select name="" id="select"></select>
    <button id="pipButtonElement">进入画中画</button>
    <button id="closeStream">关闭流</button>
  </body>
  <script>
    const video = document.getElementById("video");
    const button = document.getElementById("button");
    const select = document.getElementById("select");
    const closeStream = document.getElementById("closeStream");
    let pipButtonElement = document.getElementById("pipButtonElement");
    let mediaStream;

    button.addEventListener("click", (event) => {
      const constraints = {
        video: true,
        audio: false,
      };

      navigator.mediaDevices
        .getUserMedia(constraints)
        .then(async (stream) => {
          video.srcObject = stream;
          mediaStream = stream;
        })
        .catch((error) => {
          console.log(error);
        });
    });

    pipButtonElement.addEventListener("click", async function () {
      //change、onload、mousedown
      pipButtonElement.disabled = true;

      try {
        await video.requestPictureInPicture();
      } catch (error) {
      } finally {
        pipButtonElement.disabled = false;
      }
    });

    closeStream.addEventListener("click", () => {
      console.log("点击了");
      function stopAndRemoveTrack(mediaStream) {
        return function(track) {
          console.log("track", track);
          track.stop();
          mediaStream.removeTrack(track);
        }
      }

      mediaStream.getTracks().forEach(stopAndRemoveTrack(mediaStream))

    })

    video.onloadedmetadata = function() {
      video.requestPictureInPicture();
    }

    function gotDevices(mediaDevices) {
      select.innerHTML = "";
      select.appendChild(document.createElement("option"));
      let count = 1;

      mediaDevices.forEach((mediaDevice) => {
        if (mediaDevice.kind === "videoinput") {
          const option = document.createElement("option");
          option.value = mediaDevice.deviceId;
          const label = mediaDevice.label || `Camera ${count++}`;
          const textNode = document.createTextNode(label);
          option.appendChild(textNode);
          select.appendChild(option);
        }
      });
    }

    navigator.mediaDevices.enumerateDevices().then(gotDevices);
  </script>
</html>