与覆盆子pi上的node.js的和弦audio回放

我一直在尝试使用运行最新raspbian的树莓派3上的node.js创build和弦WAV播放:

  • 炮轰到aplay / mpg123 /其他程序 – 让我只能一次播放单一的声音
  • 我尝试了https://github.com/sebpiq/node-web-audio-api和https://github.com/TooTallNate/node-speaker (下面的示例代码)的组合,但audio质量非常低,很多的扭曲

有什么我在这里失踪? 我知道我可以很容易地用另一种编程语言(我能够用SDL编写C ++代码,用pygame编写Python),但是问题是如果node.js可能的话:)

这是我目前的web-audio-api +节点扬声器代码:

var AudioContext = require('web-audio-api').AudioContext; var Speaker = require('speaker'); var fs = require('fs'); var track1 = './tracks/1.wav'; var track2 = './tracks/1.wav'; var context = new AudioContext(); context.outStream = new Speaker({ channels: context.format.numberOfChannels, bitDepth: context.format.bitDepth, sampleRate: context.format.sampleRate }); function play(audioBuffer) { if (!audioBuffer) { return; } var bufferSource = context.createBufferSource(); bufferSource.connect(context.destination); bufferSource.buffer = audioBuffer; bufferSource.loop = false; bufferSource.start(0); } var audioData1 = fs.readFileSync(track1); var audioData2 = fs.readFileSync(track2); var audioBuffer1, audioBuffer2; context.decodeAudioData(audioData1, function(audioBuffer) { audioBuffer1 = audioBuffer; if (audioBuffer1 && audioBuffer2) { playBoth(); } }); context.decodeAudioData(audioData2, function(audioBuffer) { audioBuffer2 = audioBuffer; if (audioBuffer1 && audioBuffer2) { playBoth(); } }); function playBoth() { console.log('playing...'); play(audioBuffer1); play(audioBuffer2); } 

audio质量很低,有很多的失真

根据WebAudio规范( https://webaudio.github.io/web-audio-api/#SummingJunction ):

在audio节点的input或输出处不应用剪裁 ,以在audiographics内允许最大的dynamic范围。

现在,如果您正在播放两个audiostream,则可能会将它们相加得到超出可接受范围的值,这听起来像是失真。

尝试降低每个audiostream的音量,方法是先将它们通过GainNode进行传输,如下所示:

 function play(audioBuffer) { if (!audioBuffer) { return; } var bufferSource = context.createBufferSource(); var gainNode = context.createGain(); gainNode.gain.value = 0.5 // for instance, find a good value bufferSource.connect(gainNode); gainNode.connect(context.destination); bufferSource.buffer = audioBuffer; bufferSource.loop = false; bufferSource.start(0); } 

或者,您可以使用DynamicsCompressorNode ,但手动设置增益可以更好地控制输出。

这不是完全值得回答,但我现在不能发表评论> <

我有一个类似的问题,使用jsaudioapi制作的应用程序,相当容易修复,降低了audio的质量并改变了格式。

在你的情况下,我能想到的是将位深度和采样频率设置得尽可能低而不影响听众的体验(例如44.1kHz和16位深度)。

在理论上,你也可以尝试改变格式,wav应该相当擅长处理不占用CPU的工作,然而,还有其他的未压缩格式(例如.aiff)

您可以尝试使用pi的多个内核:

https://nodejs.org/api/cluster.html

虽然这可能会有点复杂,但是如果您正在与其他不相关的进程并行进行audiostream传输,则可以尝试在单独的CPU上移动audio。

一个(容易的),你可以尝试的东西将运行节点更多的RAM,但在你的情况下,我怀疑我是可能的。

然而,最大的问题可能是代码,可悲的是,我没有经历过你正在使用的模块,因此可以提供真正的build议(因此,为什么我说这不是答案值得:p)

您可以从节点2产生每个播放一个文件的aplay进程。 使用detached: true允许节点继续运行。