2014-03-06 31 views
3

下面是我的三個函數的一些代碼片斷,用於在Node.js中啓動,暫停和恢復可讀流。不過,我想要一個更好的方法來控制Speaker()對象,除了啓動另一個對象。節點直通流,如何正確解決管道對象?

我正在使用spotify-web模塊從spotify獲取音頻流。我可以每次撥打new Speaker()而不是使用專用對象嗎?解碼後的數據流傳輸到new Speaker()後,如何處理?

下面的代碼適用於我想要做的事情,但我覺得有更好的方法。我對Node.js和Passthrough Streams的想法很陌生,所以對於流控制的任何想法或替代方法都將不勝感激。預先感謝任何和所有幫助!

// Lame decoder & speaker objects 
var lame = new Lame.Decoder(); 
var spkr = new Speaker(); 

/* pipe a readable passthrough stream to the decoder 
* and then to coreaudio via speaker obj. 
* 
* snippet from start stream function() 
*/ 
stream 
.pipe(lame) 
.pipe(spkr) 


/* unpipe the stream 
* pause the stream at current position 
*/ 
stream 
.unpipe(lame) 
.unpipe(spkr.end()); 
stream.pause(); 


/* stream from its last position 
* how can I reuse spkr()? 
*/ 
stream 
.pipe(lame) 
.pipe(new Speaker()); 
+0

我能夠想出一些東西,但仍然存在一個錯誤,說明如何將流展開並重新導入,導致流在輸出中重疊另一個流。仍然接受其他意見,謝謝! – pdago

回答

2

最近我用spotify-web模塊遇到了同樣的問題。問題是,當你管它時,流不再處於流動模式,所以它不能被暫停。一個解決方案是每個數據塊手工編寫到解碼器(基本上就是管道會自動拒絕),具體如下:

// Lame decoder & speaker objects 
var lame = new Lame.Decoder(); 

// pipe() returns destination stream 
var spkr = lame.pipe(new Speaker()); 

// manually write data to the decoder stream, 
// which is a writeable stream 
stream.on('data', function (chunk) { 
    lame.write(chunk); 
} 

這種方式,你可以自由地調用stream.pause()stream.resume()不用擔心管道和unpiping 。

如果您正在使用Spotify軌道並希望實現暫停/播放功能,我會建議使用node-throttle來控制流的流量。這裏有一個簡單的示例腳本:

var Lame = require('lame'); 
var Speaker = require('speaker'); 
var Throttle = require('throttle'); 

var BIT_RATE = 160000; // Spotify web standard bit rate 

// Lame decoder & speaker objects 
var lame = new Lame.Decoder(); 

// pipe() returns destination stream 
var spkr = lame.pipe(new Speaker()); 

// pipe the stream to a Throttle and 
// set the stream as the Throttle 
stream = stream.pipe(new Throttle(BIT_RATE/8)); // convert to bytes per second 

// manually write data to the decoder stream, 
// which is a writeable stream 
stream.on('data', function (chunk) { 
    lame.write(chunk); 
} 

function pause() { stream.pause(); } 

function resume() { stream.resume(); } 

希望這有幫助。 Here's對Node中的流的引用;它有一些很好的信息。

+0

在決賽結束後我會給你一個機會,非常感謝你! – pdago