在 NodeJs 中解码 base64 编码的 webm 视频

Posted

技术标签:

【中文标题】在 NodeJs 中解码 base64 编码的 webm 视频【英文标题】:Decoding base64 encoded webm video in NodeJs 【发布时间】:2019-04-15 23:15:00 【问题描述】:

我正在设置一个 Express.js 端点,该端点将支持解码来自客户端(相机记录)的 base64 字符串,这基本上是一个编码的 webm 视频。 问题是为了验证这一点,我试图从服务器上编码的 base64 字符串创建一个 .webm 视频文件。不幸的是,由于“没有找到支持格式和 MIME 类型的视频”错误(Ubuntu 18.04),导致视频文件无法播放。 我对任何其他 .webm 文件都没有任何问题,但 base64 URL 肯定是正确的,因为我在 cliet 上使用它作为元素的源来重放记录的内容并且工作正常。 我怀疑的问题是在服务器路由上生成文件的代码有问题。

import express from "express";
import multer from "multer";
import fs from "fs";
const router = express.Router();
// ...

router.post("/upload", multer().fields([]), (req, res) => 
  const formData = req.body;
  // formData.vid_string is the base64 encoded string
  fs.writeFileSync(
    "./test.webm",
    Buffer.from(formData.vid_string.split(",")[1], "base64")
  );

  res.sendStatus(200);
);

我也尝试更改fs.writeFileSync 代码并添加“base64”作为第三个参数,但结果相同。 任何输入将不胜感激!谢谢!

【问题讨论】:

【参考方案1】:

我很确定这样做的正确方法是删除作为 URL 规范的 base64 字符串部分(如果这适用于您的情况,即表示 base64 数据和“video/webm”的部分字符串部分和结尾的逗号,) 并在结果字符串上调用 atob() 此 atob 将表示视频的二进制字符串版本。然后只需将该字符串写入您的新文件!

但是,我建议从客户端将 base64URL 解析为二进制字符串,因为如果您可以控制视频的显示方式,我相当确定 base64 会使用更多空间来处理较小的可用字节组发送到节点服务器。

【讨论】:

此外,您可以直接在客户端记录媒体并将块包装为文件,ondataavailable 获取块,然后您可以从那里将其附加到 FileInput 并像您一样上传普通文件。

以上是关于在 NodeJs 中解码 base64 编码的 webm 视频的主要内容,如果未能解决你的问题,请参考以下文章

javascript NodeJS:如何将base64编码的字符串解码回二进制?

[NodeJs] 如何使用nodejs对base64进行编解码?

php Base64编码/解码

如何在打字稿快递服务器中将字符串解码/编码为base64

JAVASCRIPT BASE64编码与解码

在 Java 中如何进行 BASE64 编码和解码