Camera Switch

Jeong Ha Seung·2021년 11월 7일

app.js

const frontendsocket = io();

const myface = document.getElementById("myface");
const mute = document.getElementById("mute");
const camera = document.getElementById("camera");
const camerasSelect = document.getElementById("cameras");

let myStream;
let muted = false;
let cameraOff = false;

async function getCamera() {
  try {
    const devices = await navigator.mediaDevices.enumerateDevices(); 
    //장치 리스트 가져오기
    const cameras = devices.filter((device) => device.kind ==="videoinput"); 
    //videoinput만 필터링
    const CurrentCamera = myStream.getVideoTracks()[0];

    cameras.forEach((camera) => {
      const option = document.createElement("option");
      option.value = camera.deviceId; //카메라의 고유 값을 value에 넣기
      option.innerText = camera.label; //사용자가 선택할 때는 label을 >	보고 선택 가능하게 하기
      if (CurrentCamera.lable === camera.label) {
        option.selected = true;
      }
      camerasSelect.appendChild(option); //카메라 정보를 option 항목에 넣어주기
    });
  } catch (e) {
    console.log(e);
  }
}

async function getMedia(deviceId) {
  const initialConstraints = {
    //deviceId가 없을 때 실행
    audio: true,
    video: { facingMode: "environment" },  
    //카메라가 전후면에 달려있을 경우 후면 카메라의 정보를 받음
  };
  const cameraConstraints = {
    audio: true,
    video: { deviceId: { exact: deviceId } },
  };
  try {
    myStream = await navigator.mediaDevices.getUserMedia(
      deviceId ? cameraConstraints : initialConstraints
    );
    myface.srcObject = myStream;
    if (!deviceId) {
      //처음 딱 1번만 실행(getMedia를 실행할 때만)
      await getCamera();
    }
  } catch (e) {
    console.log(e);
  }
}

getMedia();

function handleMuteButton() {
  myStream
    .getAudioTracks()
    .forEach((track) => (track.enabled = !track.enabled));
  if (!muted) {
    mute.innerText = "Unmute";
    muted = true;
  } else {
    mute.innerText = "Mute";
    muted = false;
  }
}
function handleCameraButton() {
  myStream
    .getVideoTracks()
    .forEach((track) => (track.enabled = !track.enabled));
  if (!cameraOff) {
    camera.innerText = "Turn Camera On";
    cameraOff = true;
  } else {
    camera.innerText = "Turn Camera Off";
    cameraOff = false;
  }
}

async function handleCameraChange() {
  await getMedia(camerasSelect.value);
}
mute.addEventListener("click", handleMuteButton);
camera.addEventListener("click", handleCameraButton);
camerasSelect.addEventListener("input", handleCameraChange);

home.pug

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 Noom
        link(rel="stylesheet", href="https://unpkg.com/mvp.css")
    body 
        header
            h1 Noom
        main
            div#mystream
	    	video#myface(autoplay,playsinline,width="100",height="100")
                button#mute Mute
                button#camera Turn Camera Off
                select#cameras 
                    option(value="device") Face Camera 
        script(src="/socket.io/socket.io.js")
        script(src="/public/js/app.js")
profile
블로그 이전했습니다. https://morethan-haseung-log.vercel.app

0개의 댓글