Ich habe mehrere Probleme beim Streamen eines Audios von Nodejs Server Realtime zu mehreren HTML-Clients (die auch zu späteren Zeiten verbunden sein könnte). Was ich in dem Code unten tun, ist laden 2 mp3-Dateien, in einem PufferArray und dann, wenn die Clients verbunden sind, halte ich aus PufferArray und dann drosseln bei 16384 Bytes/sec ~ 128kbits/sec und schreibe es an die Clients. Aber ich fühle, dass die Puffer ziemlich schnell geleert werden. Ist meine Vorgehensweise korrekt? Grundsätzlich sollte ich sicherstellen, dass alle Clients denselben Teil des Songs spielen sollten. Und vor allem kann keiner meiner Kunden die Songs spielen, das ist ein anderes Problem.stream audio von nodejs zu html5 audio tag
Jede Hilfe würde sehr geschätzt werden.
var http = require('http');
var fs = require("fs");
var url = require('url');
var stream = require('stream');
var Throttle = require('throttle');
var bufferArray = [];
var clients = [];
var entry = true;
setInterval(function() {
if(bufferArray.length > 0 && clients.length > 0){
entry = false;
var buffer = bufferArray.shift();
var bufferStream = new stream.PassThrough();
var throttledStream = new stream.PassThrough();
var throttle = new Throttle(16384);
bufferStream.end(new Buffer(buffer));
bufferStream.pipe(throttle).pipe(throttledStream);
throttledStream.on('data',function(data){
console.log("Going to write to all the clients "+clients.length);
for(var i = 0; i < clients.length; i++){
clients[i].write(data);
}
});
throttledStream.on('end',function(){
console.log("finished the buffer. Still have to write tot "+bufferArray.length+" buffers");
entry = true;
});
}
},1);
function readMp3FilesInBuffer(songName,callback){
var fd = fs.createReadStream("./songs/"+songName);
fd.on('data',function(chunk){
bufferArray.push(chunk);
});
fd.on('end',callback);
}
readMp3FilesInBuffer("FeelOfLove.mp3",function(){
readMp3FilesInBuffer("ILoveAfrica.mp3",function() {
console.log("successfully read the songs..");
http.createServer(function (request, response) {
var parsedUrl = url.parse(request.url,true);
var requestType = parsedUrl.query.requestType;
if(requestType == "renderHtml"){
console.log("got a request to render html");
response.writeHead(200, {
'Content-Type': 'text/html'
});
var htmlStream = fs.createReadStream("./views/audioStreaming.html");
htmlStream.pipe(response);
}
else if (requestType === "stream") {
response.writeHead(200,{
"Content-Type": "audio/mpeg",
'Transfer-Encoding': 'chunked'
});
clients.push(response);
console.log("got a request to stream. Tot clients available : "+clients.length);
}
else{
response.end();
}
}).listen(8081,function() {
console.log("listening");
});
});
});
Hey tnx für die Antwort. Ich konnte die Bitrate der Ausgabe-MP3-Datei als 128kbps mit einem npm-Modul https://github.com/fluent-ffmpeg/node-fluent-ffmpeg einstellen, das ffmpeg verwendet, wie Sie es vorgeschlagen hatten. Aber meine zweite Frage ist, ich versuche eine Live-Streaming-App zu machen. Als Vorstufe wollte ich es mit nur zwei mp3-Dateien versuchen. Ich wollte auch sicherstellen, dass zwei Clients (meist Browser), die zu verschiedenen Zeitpunkten mit dem Server verbunden waren, so synchronisiert werden sollten, dass beide Clients den gleichen Teil des Songs spielen. Wie würde ich dieses Szenario angehen? Irgendwelche Eingaben wären großartig. –
MP3 und AAC mit ADTS können beliebig segmentiert werden. Dies bedeutet, dass Sie die Daten gleichzeitig an die Browser senden können und sie sich selbst synchronisieren. Dies ist sehr hilfreich für Sie, da Ihr Server die Daten nicht kennen muss. Puffern Sie es einfach und senden Sie es wie es ist an die Clients. Verwenden Sie idealerweise einen vorhandenen Server und verwenden Sie Ihre Anwendung als Quelle für diesen Server. Sie erhalten den Vorteil, dass Sie den Code, den Sie für die Quelle des Streams haben möchten, schreiben, ohne eine Menge Zeit damit zu verbringen, die bereits vorhandenen Teile neu zu erfinden. – Brad