Захват метаданных Icecast

Я использовал пакет node-icy для получения метаданных из потока icecast.

Что делает, так это захватывает метаданные из потока. Затем поток декодируется с использованием lame и воспроизводится на Speaker.

   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. Есть ли способ сохранить icy.get(...) прослушивание без использования Speaker(). Я довольно плохо знаком с потоками. Любая помощь будет оценена.

1 ответ

Я смог решить эту проблему с помощью

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

Другие вопросы по тегам