2016-09-14 67 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,但我不想要求我的用戶在系統中進行挖掘如果可能,配置這個工作。 –