Icecast元数据捕获

时间:2018-04-10 00:12:46

标签: node.js angular stream metadata icecast

我一直在使用包node-icy来从icecast流中获取元数据。

正在做的是从流中获取元数据。然后,使用跛脚对流进行解码并在扬声器上播放。

   server.listen(port, ()=>{

        icy.get(url, (res)=> {
            // log HTTP responses headers
            console.error(res.headers);

            //log any "metadata" events that happen
            res.on('metadata', (metadata)=>{
                var parsed = icy.parse(metadata);
                console.log('Metadata event');
                console.error(parsed);
            });

            // Let's play the music (assuming MP3 data). 
            // lame decodes and Speaker sends to speakers! 
            res.pipe(new lame.Decoder())
                .pipe(new Speaker());
        });


        console.log(`Server on port: ${port}`);
    });

这将为我提供歌曲标题的输出:

Metadata event
{ StreamTitle: 'ruby the hatchet - planetary space child - killer' }

如果我删除

 res.pipe(new lame.Decoder())
            .pipe(new Speaker());

然后只抓取一次元数据。我的猜测是Speaker()函数继续运行,当元数据发生变化时,icy.get将运行res.on('metadata',...)。

我正在处理服务器上的流媒体,然后将它发送到Angular 5上的客户端。有没有办法在不使用Speaker()的情况下保持icy.get(...)监听。我对溪流很新。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

我可以使用

解决这个问题
var icy = require('icy');
var devnull = require('dev-null');

icy.get(url, function (res) {

    // log any "metadata" events that happen
    res.on('metadata', function (metadata) {
      const parsed = icy.parse(metadata);
      console.log('metadata', parsed);
    });

    res.pipe(devnull());
});

你可以在这里看到它: https://github.com/TooTallNate/node-icy/issues/16