nodejsサーバーからリアルタイムで複数のhtmlクライアントにオーディオをストリーミングしようとすると、複数の問題が発生する。以下のコードでは、bufferArrayに2つのmp3ファイルをロードし、クライアントが接続したらbufferArrayからデキューした後、16384バイト/秒〜128kbits /秒でスロットルしてクライアントに書き込みます。しかし、私は、 のバッファがかなり早く空になったと感じています。私のアプローチは正しいのですか?基本的には、すべてのクライアントが曲の同じ部分を再生する必要があることを確認する必要があります。そしてまず第一に、私のクライアントの誰もその曲を演奏することができない、それは別の問題です。ストリームオーディオnodejsからhtml5オーディオタグ
ご協力いただければ幸いです。
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。私は、提案したように、fmpegを使用するnpmモジュールhttps://github.com/fluent-ffmpeg/node-fluent-ffmpegを使用して、出力mp3ファイルのビットレートを128kbpsに設定することができました。しかし、私の2番目の質問は、ライブストリーミングアプリをやろうとしていることです。予備のステップとして、私はちょうど2つのmp3ファイルで試してみたかった。私はまた、異なる時点でサーバに接続していた2人のクライアント(一般的にはブラウザ)が、両方のクライアントが同じ曲を再生するように同期させる必要があることを確認したかったのです。どのように私はこのシナリオに近づくだろう。どんな入力も素晴らしいでしょう。 –
ADTS付きMP3およびAACは、任意にセグメント化することができます。これは、同時にデータをブラウザに送信できることを意味し、それらは自動的に同期します。これは、サーバーがデータの流れを知り、気にする必要がないため、非常に便利です。バッファリングしてそのままクライアントに送信してください。理想的には、既存のサーバーを使用し、そのサーバーのソースとしてアプリケーションを使用します。ストリームのソースに必要なコードを書いておけば、すでに利用可能な部品を再開発する時間を大幅に節約することができます。 – Brad