WebAssembly로 Canvas를 WebM 동영상으로 변환

원시 RGBA 버퍼를 WebM으로 변환하는 webm-wasm을 사용했습니다.

데모



Go 버튼을 클릭하면 Canvas를 동적으로 만들고 WebAssembly에서 WebM으로 변환하여 WebM 동영상을 video 태그로 표시합니다.
데모
소스 코드
See the Pen Simple webm wasm demo by John Doe ( @04 ) on CodePen .

1. 근로자 준비



// ワーカーで`webm-wasm.js`ファイルをロードする
const worker = new Worker("../dist/webm-worker.umd.js");
// `.wasm`ファイルのパスをワーカーに送る
worker.postMessage("../dist/webm-wasm.wasm");
// ワーカーの準備が出来るまで待つ
await nextEvent(worker, "message");


2. 프레임 레이트나 화질 등의 정보를 송신한다



worker.postMessage({ timebaseDen: framerate, width, height, bitrate });


3. Canvas를 그려 프레임 데이터를 작업자에게 보냅니다.



    const gradient = ctx.createLinearGradient(
      (1 / 4) * width,
      0,
      (3 / 4) * width,
      0
    );
    gradient.addColorStop(0, "#000");
    gradient.addColorStop(1, "#fff");
    const maxFrames = 2 * framerate;
    for (let i = 0; i < maxFrames; i++) {
      ctx.fillStyle = `hsl(${(i * 360) / maxFrames}, 100%, 50%)`;
      ctx.fillRect(0, 0, width, height);
      ctx.fillStyle = gradient;
      ctx.fillRect((1 / 4) * width, (1 / 4) * height, width / 2, height / 2);
      const imageData = ctx.getImageData(0, 0, width, height);
      // 生の画像データをワーカーに送信
      worker.postMessage(imageData.data.buffer, [imageData.data.buffer]);
    }
    // 全ての画像データを送信したらnullを送信
    worker.postMessage(null);


4. WebM으로 변환될 때까지 대기



const webm = (await nextEvent(worker, "message")).data;


5. 만든 WebM 동영상 재생



    const blob = new Blob([webm], { type: "video/webm" });
    const url = URL.createObjectURL(blob);
    const video = document.createElement("video");
    video.src = url;
    document.body.append(video);
    video.play();


5.1 또는 WebM 동영상 다운로드



a 요소의 다운로드 속성으로 다운로드




JavaScript로 파일 다운로드 처리 실현

htps : // 코 m / 와다 히로 / ms / 에 b50 아 c6




GUI에서 다운로드


좋은 웹페이지 즐겨찾기