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")