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());
4

1 回答 1

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()不必担心管道和拆管道。

如果您正在使用 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(); }

希望这会有所帮助。这是Node 中流的参考;它有一些很好的信息。

于 2014-05-13T23:44:51.657 回答