我一直在尝试用raspberry pi 3上的node.js创建复音WAV播放,运行最新的raspbian:
这里有什么我想念的吗?我知道我可以用另一种编程语言轻松地完成它(我能用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);
}
答案 0 :(得分:1)
音频质量非常低,有很多失真
根据WebAudio规范(https://webaudio.github.io/web-audio-api/#SummingJunction):
在AudioNode的输入或输出处应用clipping,以允许音频图形中的最大动态范围。
现在,如果您正在播放两个音频流,那么对它们进行求和可能会导致超出可接受范围的值,这听起来像是 - 失真。
尝试降低每个音频流的音量,首先将它们通过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,但手动设置增益可让您更好地控制输出。
答案 1 :(得分:0)
这不完全是值得回答但我现在无法发表评论><
我在使用js audio api制作的应用程序时遇到了类似的问题,并且相当容易修复,降低了音频质量并改变了格式。
在您的情况下,我能想到的是将位深度和采样频率设置得尽可能低而不影响收听者的体验(例如44.1kHz和16位深度)。
您可能也尝试更改格式,理论上,wav应该非常擅长不占用CPU的工作,但是,还有其他未压缩的格式(例如.aiff)
您可以尝试使用pi的多个核心:
https://nodejs.org/api/cluster.html
虽然这可能有点复杂,但如果您与其他不相关的进程并行进行音频流,则可以尝试在单独的CPU上移动音频。
你可以尝试的(简单)事情是运行具有更多RAM的节点,但是,在你的情况下,我怀疑我是否可能。
然而,最大的问题可能是代码,遗憾的是我对你正在使用的模块没有经验,因此可以提供真正的建议(因此,为什么我说这不值得回答:p)答案 2 :(得分:-1)
您可以从每个播放一个文件的节点2 aplay
进程生成。使用detached: true
允许节点继续运行。