fs.createReadStream('b.mp3')减少延迟

问题描述:

我正在玩触发声音(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循环并使其异步无效。我该如何减少延迟并提高效率?

您可以将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; 
}