MediaRecorder로 오디오 및 동영상 녹음

샴페인과 도넛을 준비하세요. 이제 가장 많은 별표표시가 달린 Chrome 기능이 구현되었습니다.

동영상을 위치정보 데이터와 동기화하는 스키 런 레코더, 매우 간단한 음성 메모 앱, 동영상을 녹화하여 YouTube에 업로드할 수 있는 위젯을 플러그인 없이 모두 사용할 수 있다고 상상해 보세요.

MediaRecorder API를 사용하면 웹 앱에서 오디오와 동영상을 녹화할 수 있습니다. 이 API는 현재 Firefox 및 Android 및 데스크톱용 Chrome에서 사용할 수 있습니다.

여기에서 사용해 보세요.

Android Nexus 5X의 mediaRecorder 데모 스크린샷

API는 간단합니다. WebRTC 샘플 저장소 데모의 코드를 사용하여 이를 보여드리겠습니다. 이 API는 안전한 출처(HTTPS 또는 localhost)에서만 사용할 수 있습니다.

먼저 MediaStream으로 MediaRecorder를 인스턴스화합니다. 원하는 경우 options 매개변수를 사용하여 원하는 출력 형식을 지정합니다.

var options = {mimeType: 'video/webm; codecs=vp9'};
mediaRecorder = new MediaRecorder(stream, options);

MediaStream은 다음에서 가져올 수 있습니다.

  • getUserMedia() 호출
  • WebRTC 통화의 수신 측입니다.
  • 화면 녹화
  • 웹 오디오(이 문제가 해결된 후)

options의 경우 MIME 유형을 지정할 수 있으며 향후 오디오 및 동영상 비트 전송률도 지정할 수 있습니다.

MIME 유형에는 컨테이너와 코덱을 결합한 다소 구체적인 값이 있습니다. 예를 들면 다음과 같습니다.

  • audio/webm
  • 동영상/webm
  • video/webm;codecs=vp8
  • 동영상/webm;codecs=vp9

정적 메서드 MediaRecorder.isTypeSupported()를 사용하여 MIME 유형이 지원되는지 확인합니다(예: MediaRecorder 인스턴스화 시).

var options;
if (MediaRecorder.isTypeSupported('video/webm;codecs=vp9')) {
    options = {mimeType: 'video/webm; codecs=vp9'};
} else if (MediaRecorder.isTypeSupported('video/webm;codecs=vp8')) {
    options = {mimeType: 'video/webm; codecs=vp8'};
} else {
    // ...
}

Chrome의 MediaRecorder에서 지원하는 MIME 유형의 전체 목록은 여기에서 확인할 수 있습니다.

다음으로 데이터 핸들러를 추가하고 start() 메서드를 호출하여 녹화를 시작합니다.

var recordedChunks = [];

var options = {mimeType: 'video/webm;codecs=vp9'};
mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start();

function handleDataAvailable(event) {
    if (event.data.size > 0) {
    recordedChunks.push(event.data);
    } else {
    // ...
    }
}

이 예에서는 데이터를 사용할 수 있을 때마다 recordedChunks 배열에 Blob을 추가합니다. 원하는 경우 start() 메서드에 각 Blob에 대해 캡처할 미디어 길이를 지정하는 timeSlice 인수를 제공할 수 있습니다.

녹화가 완료되면 MediaRecorder에 다음과 같이 알립니다.

mediaRecorder.stop();

녹화된 Blob 배열에서 'super-Blob'을 만들어 동영상 요소에서 녹화된 Blob을 재생합니다.

function play() {
    var superBuffer = new Blob(recordedChunks);
    videoElement.src =
    window.URL.createObjectURL(superBuffer);
}

또는 XHR을 통해 서버에 업로드하거나 YouTube와 같은 API를 사용할 수 있습니다 (아래 실험용 데모 참고).

일부 링크 해킹을 통해 다운로드할 수 있습니다.

function download() {
    var blob = new Blob(recordedChunks, {
    type: 'video/webm'
    });
    var url = URL.createObjectURL(blob);
    var a = document.createElement('a');
    document.body.appendChild(a);
    a.style = 'display: none';
    a.href = url;
    a.download = 'test.webm';
    a.click();
    window.URL.revokeObjectURL(url);
}

API 및 데모에 대한 의견

플러그인 없이 오디오와 동영상을 녹음하는 기능은 웹 앱에 비해 비교적 새로운 기능입니다. 따라서 API에 대한 의견을 보내 주시면 특히 감사하겠습니다.

또한 가장 중요한 사용 시나리오와 우선순위를 두고 싶은 기능을 알려주시기 바랍니다. 이 도움말에 댓글을 달거나 crbug.com/262211에서 진행 상황을 추적하세요.

데모

  • 이제 폴 루이스의 음성 메모 앱에 MediaRecorder 오디오를 지원하지 않는 브라우저를 위해 폴리필된 MediaRecorder 지원이 포함되어 있습니다.

Polyfill

  • Muaz Khan의 MediaStreamRecorder는 MediaRecorder와 호환되는 오디오 및 동영상 녹화용 JavaScript 라이브러리입니다.
  • Recorderjs는 Web Audio API 노드에서 녹음을 사용 설정합니다. 폴 루이스의 음성 메모 앱에서 이를 확인할 수 있습니다.

브라우저 지원

  • 기본적으로 Chrome 49 이상
  • chrome://flags에서 실험용 웹 플랫폼 기능이 사용 설정된 Chrome 데스크톱 47 및 48
  • Firefox 25 이상
  • Edge: '검토 중'

사양

w3c.github.io/mediacapture-record/MediaRecorder.html에서 확인할 수 있습니다.

API 정보

developer.mozilla.org/ko/docs/Web/API/MediaRecorder_API