簡體   English   中英

在raspberry pi上使用node.js進行復音音頻播放

[英]polyphonic audio playback with node.js on raspberry pi

我一直在嘗試使用raspberry pi 3上運行最新raspbian的node.js創建和弦WAV播放:

這里有什么我想念的嗎? 我知道我可以用另一種編程語言輕松地做到這一點(我能用SDL編寫C ++代碼,用pygame編寫Python),但問題是如果有可能用node.js :)

這是我目前的web-audio-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);
}

音質非常低,有很多失真

根據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 ,但手動設置增益可以讓您更好地控制輸出。

這不是值得回答的,但我現在不能發表評論> <

我在使用js audio api制作的應用程序時遇到了類似的問題,相當簡單的解決方法是降低音頻質量並更改格式。

在您的情況下,我能想到的是將位深度和采樣頻率設置得盡可能低而不影響收聽者的體驗(例如44.1kHz和16位深度)。

您可能還嘗試更改格式,理論上,wav應該非常擅長不占用CPU的工作,但是,還有其他未壓縮的格式(例如.aiff)

您可以嘗試使用pi的多個核心:

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

雖然這可能有點復雜,但如果您與其他不相關的進程並行進行音頻流,則可以嘗試在單獨的CPU上移動音頻。

你可以嘗試的(簡單)事情是運行帶有更多RAM的節點,但在你的情況下,我懷疑我是否可能。

然而,最大的問題可能是代碼,遺憾的是我對你正在使用的模塊沒有經驗,因此可以提供真正的建議(因此,為什么我說這不值得回答:p)

您可以從節點2個產卵aplay過程每打一個文件。 使用detached: true允許節點繼續運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM