Как внедрить в поток nodejs - PullRequest
0 голосов
/ 08 ноября 2019

Итак, у меня есть следующий скрипт, он работает, но я не могу найти лучшего решения для меня, что при запуске метаданных тега это останавливает / приостанавливает поток, воспроизводит mp3-URL, а затем снова подключается кпоток (как новое соединение).

Мне интересно, сможет ли кто-нибудь помочь с этим. Моя первая идея сработала, однако, она, казалось, приостановила поток Icecast, а затем вставила mp3 и после этого воспроизведения просто продолжила воспроизведение с паузы (это не нужно). Что бы я хотел, если бы mp3 длился 2 минуты, то поток Icecast также должен был быть пропущен на 2 минуты (надеюсь, это имеет смысл)

var http = require('http'),request = require('request');
var url = 'http://stream.radiomedia.com.au:8003/stream'; // URL to a known Icecast stream


var icecast = require('icecast-stack');
var stream = icecast.createReadStream(url);

// var radio = require("radio-stream");
// var stream = radio.createReadStream(url);

var clients = [];

stream.on("connect", function() {
  console.error("Radio Stream connected!");
  //console.error(stream.headers);
});

// Fired after the HTTP response headers have been received.
stream.on('response', function(res) {
  console.error("Radio Stream response!");
  console.error(res.headers);
});


// When a chunk of data is received on the stream, push it to all connected clients
stream.on("data", function (chunk) {
    if (clients.length > 0){
        for (client in clients){
            clients[client].write(chunk);
        };
    }
});

// When a 'metadata' event happens, usually a new song is starting.
stream.on('metadata', function(metadata) {
  var title = icecast.parseMetadata(metadata).StreamTitle;
  console.error(title);

});


// Listen on a web port and respond with a chunked response header. 
var server = http.createServer(function(req, res){ 
    res.writeHead(200,{
        "Content-Type": "audio/mpeg",
        'Transfer-Encoding': 'chunked'
    });
    // Add the response to the clients array to receive streaming
    clients.push(res);
    console.log('Client connected; streaming'); 
});
server.listen("9000", "127.0.0.1");

console.log('Server running at http://127.0.0.1:9000');

1 Ответ

0 голосов
/ 09 ноября 2019

Вы не можете просто произвольно объединить потоки, подобные этому. С MP3, битовый резервуар будет кусать вас. Как правило, это будет небольшая проблема с потоком, но у вас может быть больше разборчивых клиентов, просто разорвите соединение.

Чтобы сделать то, что вы хотите сделать, вам действительно нужно декодировать все в PCM, микшировать аудио каквы считаете нужным, а затем перекодируете новый поток.

В качестве дополнительного бонуса вы не будете привязаны к определенному кодеку и битрейту и сможете предложить соответствующий набор вариантов для своих слушателей. Вам также не придется беспокоиться о синхронизации кадров MPEG, так как ваш конечный поток может быть сэмплированным.

...