2015-09-02 165 views
0

在我正在開發的程序之一,消除回聲是一個大問題,其他開發人員已注意到在程序中有回聲漂移。要查看問題出在哪裏,我將代碼分開,並最終發現無論我做什麼,音頻都會在Node.js中漂移。音頻漂移當管道聲音在揚聲器在Node.js

步驟來重現

有一個.wav錄音使用進行採樣。

2.有一個錄音程序來記錄揚聲器的輸出,並將麥克風指向揚聲器直接錄音。

3.首先,使用普通的音頻播放器應用程序記錄正在播放的.wav。分析這兩個文件,並注意兩者中沒有音頻漂移。

4.在Node.js的

創建以下腳本
var process = require('process'); 
var argv = require('minimist')(process.argv.slice(2)); 
var Speaker = require('speaker'); 
var fs = require('fs'); 
var wav = require('wav'); 

var wavReader = fs.createReadStream(String(argv._[ 0 ])) 
.pipe(wav.Reader()); 

var buffer = null; 

wavReader.on('format', function(format) { 
    console.log("Playing wav.", format); 
    wavReader.on('data', function(chunk) { 
     if(buffer) 
      buffer = Buffer.concat([ buffer, chunk ]); 
     else 
      buffer = chunk; 
    }) 
    .on('end', function() { 
     new Speaker(format).write(buffer); 
    }); 
}); 

5.像以前一樣做同樣的記錄過程,但這個時間記錄Node.js的腳本的輸出。請注意錄音與原始文件中的音頻漂移。

這就是我在步驟5中執行上述操作時看到的內容。在我的屏幕截圖中,頂部是原始.wav文件,底部是在開頭正確對齊後的錄製版本。 Audio Drift

我想可能是節點揚聲器模塊包,所以我決定使用aplay重新編寫代碼。

var process = require('process'); 
var argv = require('minimist')(process.argv.slice(2)); 
var fs = require('fs'); 
var wav = require('wav'); 
var spawn = require('child_process').spawn; 

var wavReader = fs.createReadStream(String(argv._[ 0 ])) 
.pipe(wav.Reader()); 

var buffer = null; 

wavReader.on('format', function(format) { 
    console.log("Playing wav.", format); 
    var aplay = spawn('aplay', [ 
      "-r", String(format.sampleRate), 
      "-c", String(format.channels), 
      "-f", "S16_LE" 
     ] 
    ); 

    wavReader.pipe(aplay.stdin); 
}); 

然而,相同的音頻漂移出現在此代碼。我希望這不是在Node.js中的限制,我不必切換到C++來解決這個問題。我的Node.js版本是v0.10.30

回答

0

我用C語言測試了相同的功能。發現只有在播放8000Hz音頻時纔會出現此問題。我想,也許我的聲卡在重新採樣方面表現不佳。我在另一臺電腦上試過同樣的功能,沒有漂移。畢竟這不是Node.js問題。