首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >树莓皮的node.js复调音频回放

树莓皮的node.js复调音频回放
EN

Stack Overflow用户
提问于 2016-09-14 09:43:35
回答 4查看 1.3K关注 0票数 7

我一直在尝试在raspberry pi 3上创建带有node.js的复调WAV播放,运行最新的raspbian:

这里有我遗漏的东西吗?我知道我可以很容易地用另一种编程语言(我能够用SDL编写C++代码,用pygame编写Python ),但问题是,是否可以使用node.js :)

下面是我当前的网络音频api+节点扬声器代码:

代码语言:javascript
复制
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);
}
EN

回答 4

Stack Overflow用户

发布于 2016-09-21 08:09:44

音频质量很低,有很多失真。

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

不对剪裁的输入或输出应用AudioNode,以允许音频图形中的最大动态范围。

现在,如果你播放两个音频流,有可能把它们相加,得到一个超出可接受范围的值,这听起来像是-失真。

尝试降低每个音频流的音量,首先将它们通过一个GainNode,如下所示:

代码语言:javascript
复制
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,但是手动设置增益可以使您更好地控制输出。

票数 2
EN

Stack Overflow用户

发布于 2016-09-20 08:37:57

这不太值得回答,但我现在不能发表评论,><

我使用js音频api制作的一个应用程序也有类似的问题,这个非常简单的修复方法降低了音频的质量并改变了格式。

在您的例子中,我可以想到的是设置位深度&采样频率尽可能低,而不影响听者的体验(例如,44.1kHz和16位深度)。

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

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

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

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

您可以尝试的一件(容易的)事情是运行具有更多RAM的节点,尽管在您的情况下,我怀疑我是否可能。

然而,最大的问题可能是代码,遗憾的是,我对您正在使用的模块缺乏经验,因此可以在这方面给出真正的建议(因此,我说这不值得回答:p)

票数 0
EN

Stack Overflow用户

发布于 2021-09-25 03:11:36

当您创建音箱即时,设置参数,如这个channels = 1 //,您可以尝试1或2,并获得最佳数量的bitDepth = 16 sampleRate = 48000 //正常情况下,44100为说话和更高的音乐播放

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39487291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档