我想在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音频
答案 0 :(得分:1)
您是否曾尝试过使用la脚进行解码,然后再将其发送给扬声器? 示例:
const decoder = require("lame").Decoder;
const Speaker = require("speaker");
context.pipe(decoder()).pipe(new Speaker());