[vue.js] 사용자의 오디오/비디오를 다루는 getUserMedia()
담당하고 있는 업무에 카메라가 있고없고 어쩌고저쩌고 케이스가 추가되어 개발하고 있는데
javascript의 getUserMedia()를 통해 사용자의 카메라/마이크를 다룰 수 있다는 걸 알게되었다.
내가 문외한 getUserMedia에 대해, vue.js에서는 어떻게 사용하면 되는지 알아보자 !
getUserMedia()는 웹 브라우저에서 사용자의 카메라나 마이크와 같은 미디어 장치에 접근할 수 있게 해주는 JavaScript API이다. 이 API는 사용자가 미디어 장치 사용 권한을 요청할 수 있도록 한다. 이를 통해 카메라와 마이크를 사용한 비디오 스트리밍, 음성 녹음 앱 등 다양한 미디어 작업을 처리할 수 있다.
Vue에서 사용하려면 Vue.js 안에서 js코드 사용하여 getUserMedia()를 호출하면 된다.
1. 매개변수
getUserMedia() 함수는 하나의 객체를 인자로 받는다. 이 객체는 audio와 video 속성을 가지고 있으며, 각각 오디오와 비디오 스트림에 대한 요구사항을 지정한다.
navigator.mediaDevices.getUserMedia({
audio: true, // 오디오 스트림을 요청
video: { // 비디오 스트림을 요청
facingMode: "user" // 전면 카메라 또는 후면 카메라 선택
}
})
- audio: true 또는 false 값을 설정하여 오디오 스트림을 요청할지 여부를 결정한다.
- true: 마이크 권한을 요청한다.
- false: 오디오를 요청하지 않는다 (비디오만 요청).
- video: true, false, 또는 객체 형태로 설정할 수 있다.
- true: 기본 비디오를 요청한다 (카메라 사용).
- false: 비디오를 요청하지 않는다 (오디오만 요청).
- 객체 형태로 설정하면 세부 설정이 가능하다.
- facingMode: "user"는 전면 카메라를 요청하고, "environment"는 후면 카메라를 요청한다.
- width, height: 비디오의 해상도를 설정할 수 있다.
- frameRate: 초당 프레임 수를 지정할 수 있다.
2. 비디오와 오디오의 설정 예시
비디오 해상도와 카메라 방향을 설정하는 예시이다.
navigator.mediaDevices.getUserMedia({
video: {
facingMode: "environment", // 후면 카메라 사용
width: { ideal: 1280 }, // 비디오의 이상적인 너비
height: { ideal: 720 }, // 비디오의 이상적인 높이
frameRate: { ideal: 30 } // 초당 30프레임
},
audio: true
})
.then(function(stream) {
const videoElement = document.querySelector('video');
videoElement.srcObject = stream; // 비디오 스트림을 화면에 표시
})
.catch(function(error) {
console.error("Error accessing media devices:", error);
});
3. 스트림 객체 사용
getUserMedia()는 사용자가 제공한 미디어 스트림을 반환한다. 이 스트림 객체는 MediaStream 타입으로, 비디오와 오디오 데이터를 포함한다. 반환된 스트림은 <video> 태그에 연결하여 화면에 비디오를 출력할 수 있다.
<video autoplay></video>
navigator.mediaDevices.getUserMedia({ video: true })
.then(function(stream) {
const videoElement = document.querySelector('video');
videoElement.srcObject = stream;
})
.catch(function(error) {
console.error("Error:", error);
});
4. 스트림을 멈추기
스트림을 종료하려면 getUserMedia()로 얻은 스트림에서 각 트랙을 멈추는 방법이 필요하다. 예를 들어, 카메라와 마이크를 종료하려면 다음과 같이 할 수 있다.
function stopStream(stream) {
const tracks = stream.getTracks();
tracks.forEach(track => track.stop());
}
이렇게 하면 스트림에서 모든 트랙을 멈추고 장치 사용을 종료할 수 있다.
5. 권한 요청
getUserMedia()를 호출하면 브라우저는 자동으로 사용자에게 카메라나 마이크 사용 권한을 요청한다. 이 권한 요청은 브라우저의 기본 팝업을 통해 이루어지며, 사용자가 권한을 거부하면 catch 블록에서 오류가 발생한다.
6. 지원되는 브라우저
대부분의 최신 브라우저에서 getUserMedia()를 지원하지만, 이 API는 HTTPS 환경에서만 사용할 수 있다. 보안상의 이유로 HTTP에서는 사용할 수 없다.
- 지원 브라우저: Chrome, Firefox, Edge, Safari, Opera 등
7. 보안
사용자가 미디어 장치에 접근할지 여부는 항상 사용자가 결정한다. 즉, 권한을 부여하지 않으면 스트림을 사용할 수 없다. 권한이 필요한 작업이기 때문에 사용자에게 어떻게 요청할지에 대한 UI를 제공하는 것도 중요한 부분이다.
예시: 마이크로 음성 녹음하기
다음은 getUserMedia()를 사용하여 마이크를 통해 음성을 녹음하고 그 결과를 <audio> 태그로 재생하는 예시이다.
<audio id="audioPlayer" controls></audio>
<script>
navigator.mediaDevices.getUserMedia({ audio: true })
.then(function(stream) {
const audioElement = document.getElementById('audioPlayer');
audioElement.srcObject = stream;
})
.catch(function(error) {
console.error("Error accessing audio:", error);
});
</script>
이처럼 getUserMedia()는 웹에서 직접적으로 사용자 미디어에 접근하고 이를 다양한 방식으로 활용할 수 있게 해주는 강력한 도구이다.