2017-10-28 127 views
0

我正在玩觸發聲音(500毫秒長)的事件,因此我使用lame庫。fs.createReadStream('b.mp3')減少延遲

var lame = require('lame'); 
var fs = require('fs'); 
var Speaker = require('speaker'); 

while(listening) { 
    if(eventIsFired) { 
     fs.createReadStream('b.mp3') 
      .pipe(new lame.Decoder) 
      .pipe(new Speaker); 
    } 
} 

有什麼辦法預加載流/文件,所以我不需要在每一個事件上加載它?它實際上阻止了我的整個while循環並使其異步無效。我該如何減少延遲並提高效率?

回答

2

您可以將mp3文件緩存到buffer,然後在需要時將buffer轉換爲可讀流。

var lame = require('lame'); 
var fs = require('fs'); 
var Speaker = require('speaker'); 
var Readable = require('stream').Readable; 

var mp3Buffer = fs.readFileSync('b.mp3'); 

while(listening) { 
    if(eventIsFired) { 
     bufferToReadableStream(mp3Buffer) 
      .pipe(new lame.Decoder) 
      .pipe(new Speaker); 
    } 
} 

function bufferToReadableStream(buffer) { 
    let stream = new Readable(); 
    stream.push(buffer); 
    stream.push(null); 
    return stream; 
}