Захват метаданных 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