2014-03-06 30 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