[英]polyphonic audio playback with node.js on raspberry pi
我一直在尝试使用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);
}
音质非常低,有很多失真
根据WebAudio规范( https://webaudio.github.io/web-audio-api/#SummingJunction ):
在AudioNode的输入或输出处不应用剪切 ,以允许音频图形中的最大动态范围。
现在,如果您正在播放两个音频流,那么对它们进行求和可能会产生超出可接受范围的值,这听起来像是 - 失真。
尝试通过首先通过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 ,但手动设置增益可以让您更好地控制输出。
这不是值得回答的,但我现在不能发表评论> <
我在使用js audio api制作的应用程序时遇到了类似的问题,相当简单的解决方法是降低音频质量并更改格式。
在您的情况下,我能想到的是将位深度和采样频率设置得尽可能低而不影响收听者的体验(例如44.1kHz和16位深度)。
您可能还尝试更改格式,理论上,wav应该非常擅长不占用CPU的工作,但是,还有其他未压缩的格式(例如.aiff)
您可以尝试使用pi的多个核心:
https://nodejs.org/api/cluster.html
虽然这可能有点复杂,但如果您与其他不相关的进程并行进行音频流,则可以尝试在单独的CPU上移动音频。
你可以尝试的(简单)事情是运行带有更多RAM的节点,但在你的情况下,我怀疑我是否可能。
然而,最大的问题可能是代码,遗憾的是我对你正在使用的模块没有经验,因此可以提供真正的建议(因此,为什么我说这不值得回答:p)
您可以从节点2个产卵aplay
过程每打一个文件。 使用detached: true
允许节点继续运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.