javascript - 将 canvas.toDataURL() 传递给 ffmpeg.wasm 问题

标签 javascript canvas video ffmpeg

我正在尝试使用 FFMPEG.wasm 将 Canvas 动画转换为视频。这个想法是用 canvas.toDataURL() 生成一堆图像。然后将它们发送到节点服务器以生成视频。一切都与我从公共(public)目录中提取以进行测试的预上传图像完美配合,但是当我尝试发送使用 canvas.toDataURL() 创建的一堆(或单个)图像时我收到以下错误:

RuntimeError: abort(Error: ENAMETOOLONG: name too long, open 'data:image/png;base64, ...
我试图替换 canvas.toDataURL()canvas.getContext('2d').getImageData() ,但这也无济于事。以下是我正在使用的剪切代码:
正面:
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 秒。同样,它适用于预上传的图像,但不适用于 Canvas 数据。

最佳答案

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

  • dataURL必须是 jpeg (例如 canvas.toDataURL('image/jpeg') )。
  • 在传递给 FFMPEG 的 Buffer.from(image.split(',')[1], 'base64') 函数之前,您需要将其转换为 Buffer 值(例如 fetchFile
  • 关于javascript - 将 canvas.toDataURL() 传递给 ffmpeg.wasm 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70324936/

    相关文章:

    javascript - 如何在 d3 力定向顶点中显示徽章

    javascript - 动态调整 Canvas 及其内容的大小

    firefox - 指定了无效或非法的字符串”代码 : "12 with Canvas On Firefox

    java - Android FFmpegMediaMetadataRetriever.getFrameAtTime() 很慢

    javascript - 将身份验证方案与 Azure AD 相结合

    javascript - 什么决定了可用的 ECMAScript 版本?

    video - 使用单个命令加速和倒转视频?

    c# - 如何从C#刻录视频DVD?

    javascript - 在数据库中创建新记录 (Sails.js)

    javascript - 以编程方式更新可观察值时 Knockoutjs 不更新 UI