代码之家  ›  专栏  ›  技术社区  ›  sdvnksv

通过画布。toDataURL()到ffmpeg。wasm问题

  •  0
  • sdvnksv  · 技术社区  · 3 年前

    我正在尝试使用FFMPEG设置画布动画到视频的转换。wasm。其思想是生成一组具有 canvas.toDataURL() 然后将它们发送到节点服务器以生成视频。我正在从公共目录中提取预上传的图像进行测试,但当我尝试发送一组(或单个)使用 帆布toDataURL() 我得到以下错误:

    RuntimeError: abort(Error: ENAMETOOLONG: name too long, open 'data:image/png;base64, ...
    

    我试图替换 帆布toDataURL() 具有 canvas.getContext('2d').getImageData() 然而,这也没有帮助。下面是我使用的cut代码:

    正面:

    async function fetchData() {
      const response = await fetch('/api/record-canvas', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ image: here_goes_the_canvas_data }),
      });
    }
    
    

    后端:

    await ffmpeg.load();
    ffmpeg.FS('writeFile', `001.png`, await fetchFile(image));
    await ffmpeg.run('-loop', '1', '-i', '001.png', '-c:v', 'libx264', '-t', '30', '-pix_fmt', 'yuv420p', 'out.mp4');
    await fs.promises.writeFile('out.mp4', ffmpeg.FS('readFile', 'out.mp4'));
    

    上面的代码经过简化,可以制作一个单幅图像循环30秒的视频。同样,它可以很好地处理预上传的图像,但不能处理画布数据。

    0 回复  |  直到 3 年前
        1
  •  0
  •   sdvnksv    3 年前

    对于那些遇到相同问题的人,我提出了以下解决方案:

    1. dataURL 必须是 jpeg (例如。 canvas.toDataURL('image/jpeg') ).
    2. 您需要将其转换为缓冲区值(例如。 Buffer.from(image.split(',')[1], 'base64') 在传递到FFMPEG之前 fetchFile 作用