node.js - 如何从 blob/formdata 在 Node 服务器上写入音频文件

标签 node.js express audio multer web-mediarecorder

我有一个以音频/webm 格式录制的 MedaRecroder 流。我将其发送到 Node 服务器。我可以在 req.files 下的响应中看到该文件,但是当我播放它们时,听起来好像存在编码错误。

我正在尝试将音频文件写入服务器(最好是 .wav,但 webm 也可以),以便我可以访问和播放音频

function onRecordingReady(e) {
  var audio = document.getElementById('audio');
  var tag = document.getElementById('tag').value
  audio.src = URL.createObjectURL(e.data);
  audio.play();
  var formData = new FormData()
   formData.append('source', e.data);
   formData.append('tag', tag);
  $.ajax({
    url: 'http://localhost:3300/api/kb8',
    type: "POST",
    data:formData,
    processData: false,
    contentType: false,
    success: function(data) {
            console.log(data);
    }
  });

在我的服务器上,我正在像这样处理帖子

const express = require('express');
const bodyParser = require('body-parser');
const multer  = require('multer');
const fs = require('fs');
const wav = require('wav');
let upload = multer();
const app = express();
const PORT = process.env.PORT || 3300;
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
}));
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

app.get('/', function(req, res){
  res.send('hello world');
});   

app.post('/api/kb8', upload.any(), function(req, res) {
    let formData = req.body;
    let files = req.files;
    fs.writeFileSync('audio/audiotest.webm', req.files);
    console.log('form data', formData, 'file' , files);
    res.sendStatus(200);
});

这是我的控制台输出

form data { tag: 'tag',  } file { fieldname: 'source',
  originalname: 'blob',
  encoding: '7bit',
  mimetype: 'audio/webm',
  buffer: <Buffer 1a 45 df a3 9f 42 86 81 01 42 f7 81 01 42 f2 81 04 42 f3 81 08 42 82 84 77 65 62 6d 42 87 81 04 42 85 81 02 18 53 80 67 01 ff ff ff ff ff ff ff 15 49 ... >,
  size: 14322 }

最佳答案

我明白了。

Multer 在请求对象上创建文件数组 (req.files) 为了访问缓冲区并写入文件,您必须执行此操作..

fs.writeFileSync('audio/audiotest.webm', req.files[0].buffer);

希望这有帮助。

关于node.js - 如何从 blob/formdata 在 Node 服务器上写入音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47896482/

相关文章:

node.js - 是否可以在不申请新应用程序的情况下更改重定向?音云API

javascript - Mocha/Chai expect.to.throw 没有捕捉到抛出的错误

node.js - Express.js : How to serve one file for the default "/" route, 然后使用express.static 其余部分?

javascript - 如何在express js中添加时间戳?

javascript - express ,使用不同进口的相同路线?

python - 如何在python中从ffmpeg流中提取视频和音频

javascript - 显示来自 GridFs (MongoDB) 的图像

javascript - 如何将变量传递给 Pug 的 `script.` block ?

javascript - 在 Canvas 上使用 javascript 实现 3D 声音

java - 使用 Java 源数据线进行音频时出现爆音/爆裂声