<!DOCTYPE html> <html> <!-- ahhh --> <body style="margin: 0; overflow: hidden"> <canvas id="myCanvas" width="10" height="10" style="display: block; box-sizing: border-box" > Your browser does not support the HTML5 canvas tag.</canvas > <script src="https://unpkg.com/@ffmpeg/ffmpeg@0.10.0/dist/ffmpeg.min.js"></script> <script> const { createFFmpeg } = FFmpeg; const ffmpeg = createFFmpeg({ log: true, }); const transcode = async (webcamData) => { const message = document.getElementById("message"); const name = "record.webm"; await ffmpeg.load(); message.innerHTML = "Start transcoding"; await ffmpeg.write(name, webcamData); await ffmpeg.transcode(name, "output.mp4"); message.innerHTML = "Complete transcoding"; const data = ffmpeg.read("output.mp4"); const video = document.getElementById("output-video"); video.src = URL.createObjectURL( new Blob([data.buffer], { type: "video/mp4" }) ); dl.href = video.src; dl.innerHTML = "download mp4"; }; fn().then(async ({ url, blob }) => { transcode(new Uint8Array(await blob.arrayBuffer())); }); function fn() { var recordedChunks = []; var time = 0; var canvas = document.getElementById("canvas"); return new Promise(function (res, rej) { var stream = canvas.captureStream(60); mediaRecorder = new MediaRecorder(stream, { mimeType: "video/webm; codecs=vp9", }); mediaRecorder.start(time); mediaRecorder.ondataavailable = function (e) { recordedChunks.push(event.data); // for demo, removed stop() call to capture more than one frame }; mediaRecorder.onstop = function (event) { var blob = new Blob(recordedChunks, { type: "video/webm", }); var url = URL.createObjectURL(blob); res({ url, blob }); // resolve both blob and url in an object myVideo.src = url; // removed data url conversion for brevity }; // for demo, draw random lines and then stop recording var i = 0, tid = setInterval(() => { if (i++ > 20) { // draw 20 lines clearInterval(tid); mediaRecorder.stop(); } let canvas = document.querySelector("canvas"); let cx = canvas.getContext("2d"); cx.beginPath(); cx.strokeStyle = "green"; cx.moveTo(Math.random() * 100, Math.random() * 100); cx.lineTo(Math.random() * 100, Math.random() * 100); cx.stroke(); }, 200); }); } let c = document.getElementById("myCanvas"); let ctx = c.getContext("2d"); ctx.canvas.width = window.innerWidth; ctx.canvas.height = window.innerHeight; let deg_per_sec = 30 / 5000; let time = 0.1; let fps = 60; centerX = ctx.canvas.width / 2; centerY = ctx.canvas.height / 2; rotation = 0; //was = j = angle currentFrame = 0; //was = i function render() { if (currentFrame < time / (1 / fps)) { setTimeout(() => { render(); render_clear(); // Draw_Phyllotaxis(rotation + 3.1); Draw_Phyllotaxis(rotation + 1.5); console.log(rotation + 3.1); // Draw_Phyllotaxis(rotation/5000); // Draw_center(); //Debugging // DrawBorder(); }, 1000 / fps); rotation += deg_per_sec / fps; // was = j = angle, now = rotation currentFrame += 1; // was = i } } render(); function Draw_Phyllotaxis(angle) { // colour1 = [255, 170, 0]; // colour2 = [255, 0, 221]; colour1 = [45, 129, 252]; colour2 = [252, 3, 98]; var c = 24; //something to do with width. but not width for (let n = 0; n < 300; n += 1) { ncolour = LerpRGB(colour1, colour2, Math.cos(rad(n / 2))); var a = n * angle; //137.5; var r = c * Math.sqrt(n); var x = r * Math.cos(a) + centerX; var y = r * Math.sin(a) + centerY; ctx.beginPath(); ctx.arc(x, y, 8, 0, 2 * Math.PI); ctx.fillStyle = colourToText(ncolour); ctx.fill(); } } function rad(degrees) { var pi = Math.PI; return degrees * (pi / 180); } function LerpRGB(a, b, t) { if (t < 0) { t *= -1; } var newColor = [0, 0, 0]; newColor[0] = a[0] + (b[0] - a[0]) * t; newColor[1] = a[1] + (b[1] - a[1]) * t; newColor[2] = a[2] + (b[2] - a[2]) * t; return newColor; } function colourToText(colour) { return "rgb(" + colour[0] + "," + colour[1] + "," + colour[2] + ")"; } function render_clear() { ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.fillStyle = "black"; ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height); } </script> </body> </html>