在raspberry pi上使用node.js进行复音音频播放

Szy*_*ski 6 javascript audio node.js

我一直在尝试使用raspberry pi 3上运行最新raspbian的node.js创建和弦WAV播放:

这里有什么我想念的吗?我知道我可以用另一种编程语言轻松地做到这一点(我能用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);
}
Run Code Online (Sandbox Code Playgroud)

Geo*_*e H 0

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

我在使用 js 音频 api 制作的应用程序中遇到了类似的问题,并且相当简单的修复方法是降低音频质量并更改格式。

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

您也可以尝试更改格式,wav,理论上应该非常擅长不占用CPU资源,但是,还有其他未压缩的格式(例如.aiff)

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

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

尽管这可能有点复杂,但如果您与其他不相关的进程并行执行音频流,则可以尝试在单独的 CPU 上移动音频。

您可以尝试的一个(简单)事情是运行具有更多 RAM 的节点,尽管就您而言,我怀疑我是否可能。

然而,最大的问题可能是代码,遗憾的是我对您正在使用的模块没有经验,因此可以就此提供真正的建议(因此,为什么我说这不值得回答:p)