How to save canvas animation as gif or webm?

后端 未结 2 1217
天涯浪人
天涯浪人 2020-11-29 03:31

i have written this function to capture each frame for the GIF but the output is very laggy and crashes when the data increases. Any suggestions ?

Code :

<         


        
相关标签:
2条回答
  • 2020-11-29 04:15

    You can also use https://github.com/spite/ccapture.js/ to capture to gif or video.

    0 讨论(0)
  • 2020-11-29 04:20

    In modern browsers you can use a conjunction of the MediaRecorder API and the HTMLCanvasElement.captureStream method.

    The MediaRecorder API will be able to encode a MediaStream in a video or audio media file on the fly, resulting in far less memory needed than when you grab still images.

    const ctx = canvas.getContext('2d');
    var x = 0;
    anim();
    startRecording();
    
    function startRecording() {
      const chunks = []; // here we will store our recorded media chunks (Blobs)
      const stream = canvas.captureStream(); // grab our canvas MediaStream
      const rec = new MediaRecorder(stream); // init the recorder
      // every time the recorder has new data, we will store it in our array
      rec.ondataavailable = e => chunks.push(e.data);
      // only when the recorder stops, we construct a complete Blob from all the chunks
      rec.onstop = e => exportVid(new Blob(chunks, {type: 'video/webm'}));
      
      rec.start();
      setTimeout(()=>rec.stop(), 3000); // stop recording in 3s
    }
    
    function exportVid(blob) {
      const vid = document.createElement('video');
      vid.src = URL.createObjectURL(blob);
      vid.controls = true;
      document.body.appendChild(vid);
      const a = document.createElement('a');
      a.download = 'myvid.webm';
      a.href = vid.src;
      a.textContent = 'download the video';
      document.body.appendChild(a);
    }
    
    function anim(){
      x = (x + 1) % canvas.width;
      ctx.fillStyle = 'white';
      ctx.fillRect(0,0,canvas.width,canvas.height);
      ctx.fillStyle = 'black';
      ctx.fillRect(x - 20, 0, 40, 40);
      requestAnimationFrame(anim);
    }
    <canvas id="canvas"></canvas>

    0 讨论(0)
提交回复
热议问题