我一直在尝试在raspberry pi 3上创建带有node.js的复调WAV播放,运行最新的raspbian:
这里有我遗漏的东西吗?我知道我可以很容易地用另一种编程语言(我能够用SDL编写C++代码,用pygame编写Python ),但问题是,是否可以使用node.js :)
下面是我当前的网络音频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);
}发布于 2016-09-21 08:09:44
音频质量很低,有很多失真。
根据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,但是手动设置增益可以使您更好地控制输出。
发布于 2016-09-20 08:37:57
这不太值得回答,但我现在不能发表评论,><
我使用js音频api制作的一个应用程序也有类似的问题,这个非常简单的修复方法降低了音频的质量并改变了格式。
在您的例子中,我可以想到的是设置位深度&采样频率尽可能低,而不影响听者的体验(例如,44.1kHz和16位深度)。
您也可以尝试更改格式,从理论上讲,wav应该非常擅长于不占用CPU的工作,但是,还有其他未压缩格式(如.aiff)。
您可以尝试使用pi的多个核心:
https://nodejs.org/api/cluster.html
尽管这可能有点复杂,但是如果您正在与其他无关进程并行执行音频流,则可以尝试将音频移动到单独的CPU上。
您可以尝试的一件(容易的)事情是运行具有更多RAM的节点,尽管在您的情况下,我怀疑我是否可能。
然而,最大的问题可能是代码,遗憾的是,我对您正在使用的模块缺乏经验,因此可以在这方面给出真正的建议(因此,我说这不值得回答:p)
发布于 2021-09-25 03:11:36
当您创建音箱即时,设置参数,如这个channels = 1 //,您可以尝试1或2,并获得最佳数量的bitDepth = 16 sampleRate = 48000 //正常情况下,44100为说话和更高的音乐播放
https://stackoverflow.com/questions/39487291
复制相似问题