gpt4 book ai didi

javascript - 在树莓派上使用 node.js 进行和弦音频播放

转载 作者:数据小太阳 更新时间:2023-10-29 05:37:47 25 4
gpt4 key购买 nike

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

这里有什么我遗漏的吗?我知道我可以用另一种编程语言轻松地做到这一点(我能够用 SDL 编写 C++ 代码,用 pygame 编写 Python),但问题是 node.js 是否可行:)

这是我当前的 web-audio-api + node-speaker 代码:

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 quality is very low, with a lot of distortions

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

No clipping is applied at the inputs or outputs of the AudioNode to allow a maximum of dynamic range within the audio graph.

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

首先尝试通过 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 ,但手动设置增益可以让您更好地控制输出。

关于javascript - 在树莓派上使用 node.js 进行和弦音频播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39487291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com