使用node.js播放PCM音频

时间:2018-08-26 18:20:22

标签: javascript node.js express audio web-audio-api

我想在nodejs服务器上生成特定的声音模式,然后使用express.js将音频流传输到http客户端。

使用WebAudio API https://github.com/mohayonao/web-audio-engine/的这种实现,我可以使用扬声器模块直接在服务器上播放一些生成的音频,如示例(https://github.com/mohayonao/web-audio-engine#example

const Speaker = require("speaker");
const AudioContext = require("web-audio-engine").StreamAudioContext;

function audio(){
  const context = new AudioContext();

  const osc = context.createOscillator();
  osc.type = "sine";
  osc.frequency.setValueAtTime(220, 0);
  osc.frequency.setValueAtTime(440, 1);
  osc.start(0);
  osc.stop(2);
  osc.connect(context.destination);
  osc.onended = () => {
    console.log("finished")
    delete context
  };

  context.pipe(new Speaker());       
  context.resume();
}

audio()

现在,我尝试将音频流传递到express的http响应:

const express = require("express")
const app = express();

app.get('/', function (req, res) {
  res.set('Content-Type', 'audio/wav');
  audio((context)=>{
    context.pipe(res)
  })
});

app.listen(3000)


const Speaker = require("speaker");
const AudioContext = require("web-audio-engine").StreamAudioContext;

function audio(callback){
  const context = new AudioContext();

  const osc = context.createOscillator();
  osc.type = "sine";
  osc.frequency.setValueAtTime(220, 0);
  osc.frequency.setValueAtTime(440, 1);
  osc.start(0);
  osc.stop(2);
  osc.connect(context.destination);
  osc.onended = () => {
    console.log("finished")
    delete context
  };

  callback(context);
  context.resume();
}

当我在浏览器中打开localhost:3000时,现在有一个音频播放器,因此可以识别内容类型,但是它没有播放任何内容,只是显示正在加载的动画。 2秒钟后,音频流结束时,它会显示“文件损坏”图标。
如何以正确的方式(以wav格式)流式传输所生成的PCM音频

1 个答案:

答案 0 :(得分:1)

您是否曾尝试过使用la脚进行解码,然后再将其发送给扬声器? 示例:

const decoder = require("lame").Decoder;
const Speaker = require("speaker");

context.pipe(decoder()).pipe(new Speaker());

Link to Lame