video.onplay = async (e) => {
video.onplay = null;
console.log(e);
try {
const canvasStream = canvas.captureStream(0);
const [canvasTrack] = canvasStream.getVideoTracks();
canvasTrack.onmute = canvasTrack.onunmute = (e) => {
console.log(e);
};
const renderStream = document.createElement('video');
renderStream.autoplay = renderStream.controls = true;
document.body.appendChild(renderStream);
const ms = new MediaSource();
const msRender = document.createElement('video');
document.body.appendChild(msRender);
msRender.autoplay = msRender.controls = true;
let sourceBuffer;
ms.onsourceopen = (e) => {
sourceBuffer = ms.addSourceBuffer('video/webm;codecs=vp8');
};
msRender.src = URL.createObjectURL(ms);
renderStream.srcObject = canvasStream;
const recorder = new MediaRecorder(renderStream.srcObject);
recorder.ondataavailable = async ({ data }) => {
const buffer = await data.arrayBuffer();
// send buffer to RTCDataChannel
sourceBuffer.appendBuffer(buffer);
};
recorder.start(100);
//setTimeout(() => recorder.stop(), 30000)
const rs = new ReadableStream({
async pull(controller) {
if (!video.paused) {
const frame = await createImageBitmap(video, {
resizeWidth: 50,
resizeHeight: 50,
});
ctx.drawImage(frame, 0, 0, 50, 50);
canvasTrack.requestFrame();
controller.enqueue(
await new Promise((resolve) => setTimeout(resolve, 1000 / 60))
);
} else {
controller.close();
}
},
}).pipeTo(new WritableStream());
} catch (err) {
console.error(err);
}
};
};