WebAssembly로 Canvas를 WebM 동영상으로 변환
10091 단어 WebM캔버스WebAssembly
데모
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 동영상 다운로드
// ワーカーで`webm-wasm.js`ファイルをロードする
const worker = new Worker("../dist/webm-worker.umd.js");
// `.wasm`ファイルのパスをワーカーに送る
worker.postMessage("../dist/webm-wasm.wasm");
// ワーカーの準備が出来るまで待つ
await nextEvent(worker, "message");
worker.postMessage({ timebaseDen: framerate, width, height, bitrate });
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);
const webm = (await nextEvent(worker, "message")).data;
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();
a 요소의 다운로드 속성으로 다운로드
JavaScript로 파일 다운로드 처리 실현
htps : // 코 m / 와다 히로 / ms / 에 b50 아 c6
Reference
이 문제에 관하여(WebAssembly로 Canvas를 WebM 동영상으로 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/relu/items/05a5904d4466fec225b8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)