캔버스를 레코딩하여 비디오 파일(webm)로 다운로드하는 방법에 대해서 알아본다.

캔버스 레코딩은 캔버스 태그의 captureStream 인터페이스와 MediaRecorder API 를 활용하여 수행할 수 있다. MediaRecorder 는 Canvas 뿐 아니라 미디어 스트림을 사용하는 WebRTC 등에도 적용할 수 있다.

캔버스 태그

<canvas id="canvas" width="800" height="500"></canvas>

캔버스 객체 생성

var canvas = document.getElementById("canvas");

미디어 스트림 생성

var stream = canvas.captureStream();

미디어레코더 생성

var rec = new MediaRecorder(stream);

미디어 레코더 메소드

  • 레코딩을 수행하기 위한 메소드는 아래 두가지가 있다.
이름 설명
start 레코딩을 시작한다
stop 레코딩을 중단한다

미디어 이벤트

  • 레코딩을 수행하기 위한 이벤트는 목록은 아래와 같다.
이름 설명
onstart 레코딩이 시작되면 호출되는 이벤트이다
onstop 레코딩이 중단되면 호출되는 이벤트이다
ondataavailable 레코딩이 시작되면 주기적으로 호출되어 캡처한 미디어 데이터를 얻을 수 있는 이벤트이다

레코딩하기

var chunks = []; //레코딩 데이터를 담을 배열

//ondataavailable 이벤트가 주기적으로 호출되면서 chunks 배열에 레코딩 데이터를 쌓음
rec.ondataavailable = function(){
  chunks.push(e.data);
};

//3초 주기로 레코딩을 시작함. 3초마다 ondataavailable 가 호출된다.
rec.start(3000);
  • start 메소드 호출시 인자로 timeslice 을 전달한다. 예를 들어 3000 을 전달하면 미디어 레코더 객체는 3초동안 레코딩 데이터를 수집하여 ondataavailable 를 호출한다.
  • 그러나 만약 3초동안 캔버스에 아무런 변화가 없다면 ondataavailable 는 호출되지 않는다.

레코딩 중단하기

rec.stop();

레코딩 결과 다운로드 하기

rec.onstop = function(){
  var encodeData = new Blob(chunks, {type: "video/webm"});

  var doc = document,
    link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a"),
    event = doc.createEvent("MouseEvents");

  link.href = URL.createObjectURL(encodeData);
  link.download = "file.webm";

  event.initEvent("click", true, false);
  link.dispatchEvent(event);

  chunks = [];
}