Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了从Node.js上的Web Audio API播放PCM流大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我从带有网络音频api的浏览器流式录制PCM音频.

我用binaryJS (websocket connection)将其流式传输到nodejs服务器,我正在使用扬声器npm模块在服务器上播放该流.

这是我的客户The audio buffers are at first non-interleaved IEEE 32-bit linear PCM with a nominal range between -1 and +1.我把两个PCM通道中的一个开始下面的流.

var client = new BinaryClient('ws://localhost:9000');
var Stream = client.send();

recorder.onaudioprocess = function(AudioBuffer){
    var leftChannel = AudioBuffer.inputBuffer.getChannelData (0);
    Stream.write(leftChannel);
}

现在我将数据作为缓冲区接收,并尝试从npm包中将其写入扬声器对象.

var Speaker = require('speaker');

var speaker = new Speaker({
  channels: 1,// 1 channel
  bitDepth: 32,// 32-bit samples
  sampleRate: 48000,// 48,000 Hz sample rate
  signed:true
});

server.on('connection',function(client){
    client.on('stream',function(stream,Meta){
        stream.on('data',function(data){
            speaker.write(leftchannel);
        });
    });
});

结果是笔记本电脑扬声器上的高音尖叫声,显然不是录音.这也不是反馈.我可以确认客户端上的记录缓冲区是有效的,因为我尝试将它们写入WAV文件并且播放得很好.

docs for speakerdocs for the AudioBuffer有问题

我已经被困在这几天了.有人可以弄清楚是错的还是提供不同的方法

解决方案更新

首先,我正在使用websocket API.我上面更新以正确使用它.

我需要将音频缓冲区转换为整数的数组缓冲区.我选择使用Int16Array.由于给定的音频缓冲区具有介于1和-1之间的范围,所以简单到乘以新的ArrayBuffer(32767到-32768)的范围.

recorder.onaudioprocess = function(AudioBuffer){

    var left = AudioBuffer.inputBuffer.getChannelData (0);

    var l = left.length;
    var buf = new Int16Array(l)

    while (l--) {
        buf[l] = left[l]*0xFFFF;    //convert to 16 bit
    }

    Stream.write(buf.buffer);

}

解决方法@H_301_41@
看起来你正在将流作为元对象发送.

根据文档,BinaryClient.send以该顺序获取数据对象(流)和元对象. stream事件的回调在第一个参数中接收流(作为BinaryStream对象,而不是缓冲区),第二个参数中的元对象.

您将传递send()作为流的字符串“channel”,将来自getChannelData()的Float32Array作为元对象传递.也许如果你要交换这两个参数(或者只是使用client.send(leftChannel)),然后更改服务器代码,将流传递给speaker.write而不是leftchannel(这应该可能被重命名Meta),或者如果你丢弃不需要它),它可能会工作.

请注意,由于Float32Array不是流或缓冲区对象,BinaryJS可能为try to send it in one chunk.您可能需要发送leftChannel.buffer(the ArrayBuffer behind that object).

让我知道,如果这适用于你;我现在无法测试您的确切设置.

大佬总结

以上是大佬教程为你收集整理的从Node.js上的Web Audio API播放PCM流全部内容,希望文章能够帮你解决从Node.js上的Web Audio API播放PCM流所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: