+
웹캠 끄기 기능을 추가한다.<video class="player"></video>
const video = document.querySelector('.player');
function getVideo() {
const options = {
video:true,
audio:false
};
navigator.mediaDevices.getUserMedia(options)
.then(localMediaStream => {
video.srcObject = localMediaStream;
video.play();
})
.catch(err => {
console.error("error", err);
});
}
navigator.mediaDevices.getUserMedia
을 이용하면 사용자의 허가에 따라 웹캠 스트리밍 데이터를 가져올 수 있다.
해당 데이터를 <video>
요소에 넣고 play() 메서드
를 이용하면 스트리밍되는 웹캠을 띄울 수 있다.
function clearVideo() {
const stream = video.srcObject;
const tracks = stream.getTracks();
tracks.forEach(track => track.stop());
video.srcObject = null;
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
<video>
요소의 srcobject 속성
에서 들어오는 비디오 MediaStream 을 가져온 다음 스트림의 getTracks() 메서드
를 호출 하여 스트림의 트랙 배열을 가져와 각 스트림의 트랙 배열을 stop() 메서드
를 통해 중지시킬 수 있었다.
그 후, 기존에 남아있는 srcobject 속성
초기화 및 캔버스에 해당 웹캠을 그려주고 있었기 때문에 캔버스도 초기화 시켜주었다.
<div class="photobooth">
<div class="controls">
<button class="take-photo">Take Photo</button>
<button class="video-on">video on</button>
<button class="video-off">video off</button>
</div>
<canvas class="photo"></canvas>
<video class="player"></video>
<div class="strip"></div>
</div>
<audio class="snap" src="./snap.mp3" hidden></audio>
const strip = document.querySelector('.strip');
const snap = document.querySelector('.snap');
function takePhoto() {
snap.currentTime = 0;
snap.play();
const photoURL = canvas.toDataURL('image/jpeg');
const link = document.createElement('a');
link.href = photoURL;
link.setAttribute('download', 'undefined');
link.innerHTML = `<img src="${photoURL}" />`;
strip.insertBefore(link, strip.firstChild);
}
캡쳐 버튼 클릭 시, 소리도 나게하기 위해 <audio>
요소를 이용했기 때문에 각 캡쳐 버튼 클릭시 마다 currentTime = 0으로 해주어 처음부터 재생될 수 있게 하였다.
그 후, 캔버스에 그려진 현재 웹캠의 이미지를 canvas.toDataURL() 메서드
를 이용하여 URL로 만든 후 새로 만든 <a>
요소에 넣어 캡처 기능을 구현할 수 있었다.