2016-09-14 66 views
5

我一直在试图建立与树莓派3的node.js运行最新raspbian和弦WAV播放:和弦音频播放与树莓派的node.js

的有什么我在这里失踪?我知道我可以用另一种编程语言轻松地完成它(我可以用SDL编写C++代码,用pygame编写Python),但是问题是node.js是否可以使用:

这是我的当前web-音频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

这是不完全应答,值得,但我不能在此刻发表评论> <

我有一个类似的问题与应用程式所使用js audio api和相当简单的解决方法是降低音频质量并改变格式。

在你的情况下,我能想到的是在不影响听众体验(例如44.1kHz和16位深度)的情况下,将采样频率设置得尽可能低以尽可能地降低采样频率&。

您也可以尝试改变格式,WAV,理论上应该是不是CPU密集型的工作相当不错,但是,也有其他的压缩格式(如.AIFF)

您可以尝试使用在PI的多个内核:

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

虽然这可能证明有点复杂,如果你正在做的音频流与其他不相关的进程并行,你可以尝试在一个单独的CPU移动音频。

一个(简单)的事情,你可以尝试将正在运行的节点有更多的RAM,虽然在你的情况,我怀疑我可能。

然而,最大的问题可能是代码,可悲的是,我没有经历过你正在使用的模块,因此可以给予真正的建议(因此,为什么我说这不是答案值得:p )

+0

音频已经是44.1kHz和16bit深度;它在C++和Python中运行得非常好,所以我认为我用JS代码做错了,或者node-speaker/node-web-audio-api实现有问题。我认为RAM和CPU不应该是一个问题,因为它在其他实现中起作用。 –

1

音频质量是非常低的,用了很多的扭曲

按照WebAudio规范的(https://webaudio.github.io/web-audio-api/#SummingJunction):

clipping在输入或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,但手动设置增益可以提供对输出更多的控制。

+0

增益不是问题(测试),声音没有过度驱动,但点击和弹出(有空的“休息”);我也不是在这里使用浏览器WebAudio API,而是使用node.js实现它,它可能与浏览器不同。 –

0

您可以从节点2产生aplay每个播放一个文件的进程。使用detached: true允许节点继续运行。

+0

这不起作用,即使我打开两个终端并一次播放两个文件,我认为它的工作我需要设置dmix,但我不想要求我的用户在系统中进行挖掘如果可能,配置这个工作。 –