Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将音频从nodejs流到html5音频标签_Javascript_Node.js_Html_Audio_Audio Streaming - Fatal编程技术网

Javascript 将音频从nodejs流到html5音频标签

Javascript 将音频从nodejs流到html5音频标签,javascript,node.js,html,audio,audio-streaming,Javascript,Node.js,Html,Audio,Audio Streaming,我在尝试将音频从nodejs服务器实时流传输到多个html客户端时遇到了多个问题(以后可能还会连接到这些客户端)。在下面的代码中,我所做的是在一个缓冲阵列中加载2个mp3文件,然后当客户端连接后,我从缓冲阵列中不断退出队列,然后以16384字节/秒~128kbits/秒的速度限制并将其写入客户端。但我觉得 缓冲区很快就会清空。我的方法正确吗。基本上,我应该确保所有的客户都在播放这首歌的同一部分。首先,我的客户都不能播放歌曲,这是另一个问题 任何帮助都将不胜感激 var http = requir

我在尝试将音频从nodejs服务器实时流传输到多个html客户端时遇到了多个问题(以后可能还会连接到这些客户端)。在下面的代码中,我所做的是在一个缓冲阵列中加载2个mp3文件,然后当客户端连接后,我从缓冲阵列中不断退出队列,然后以16384字节/秒~128kbits/秒的速度限制并将其写入客户端。但我觉得 缓冲区很快就会清空。我的方法正确吗。基本上,我应该确保所有的客户都在播放这首歌的同一部分。首先,我的客户都不能播放歌曲,这是另一个问题

任何帮助都将不胜感激

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");
    });

  });
});
var http=require('http');
var fs=要求(“fs”);
var url=require('url');
var stream=require(‘stream’);
var节流阀=需要(“节流阀”);
var bufferArray=[];
var客户=[];
var条目=真;
setInterval(函数(){
if(bufferArray.length>0&&clients.length>0){
输入=假;
var buffer=bufferArray.shift();
var bufferStream=new stream.PassThrough();
var throttledStream=new stream.PassThrough();
var油门=新油门(16384);
end(新的缓冲区(Buffer));
缓冲流。管道(节流)。管道(节流流);
throttledStream.on('data',函数(data){
log(“将写入所有客户端”+clients.length);
对于(变量i=0;i
这里有相当多的代码,还有相当多的信息缺失。。。但也有很多事情值得指出,这可能是你的具体问题的根源

你提到客户不能玩。他们是否在正确的路线上使用您的流?他们是否获得了正确的标题和数据?如果没有,请先解决这个问题

只有大约三分之一的流媒体音频播放器能够正确处理分块编码。若你们在浏览器中(实际上是在一个网页上),你们通常会没事的,但除此之外,分块编码是不可能的。您需要强制Node.js完全跳过分块编码

您没有指出您使用的油门模块。这是Tootallate的巧合吗?如果是这样的话,我以前在这个模块上遇到过麻烦。它最近没有更新过,可能与modern Node.js“streams3”不太配合

在任何情况下,您进行节流的方式都是不合适的。虽然您的平均比特率可能是128k,但不一定精确到128k。你不应该假设比特率。您可以编写自己的代码来读取MP3帧头并进行相应的同步,但在其他地方已经这样做了,为什么还要这样做呢?我会启动FFmpeg作为子进程,并让它实时运行。未经测试,但大致如下:

ffmpeg -re -i yourfile.mp3 -map_metadata -1 -acodec copy -f mp3 -
除了根据实际媒体进行节流外,这还可以去除所有随机ID3标签和iTunes等软件喜欢嵌入在MP3中的其他随机垃圾,以非常小的开销为您提供一个干净的流

您将遇到的下一个问题是,您的客户端需要很长时间来缓冲和开始播放。有一个相当大的缓冲区,可以在它们连接后立即刷新到它们,这就解决了这个问题

许多浏览器(如Chrome)会发出范围请求,试图像对待任何其他MP3文件一样对待您的流。如果您只是像现在这样忽略这些范围请求,那么一切都会正常工作。你可以考虑处理它们,基于你正在做的事情的细节。


在一天结束时,你可以让它工作,但有很多涉及,和许多小的调整,使所有的听众流工作。我是否可以建议让溪流服务于已经这样做的东西,比如Icecast?您仍然可以在Node.js中为流提供源代码,允许您在流的源代码周围绑定任何您想要的应用程序逻辑。一点自我推销。。。我有一些Node.js代码可以授权您连接到Icecast。我还有一个CDN,您可以直接从Node.js应用程序流式传输到它。你可以在或发电子邮件给我brad@audiopump.co. 即使你决定自己做这件事,也要考虑从你的No.js应用程序中获取流并从其他东西上服务。我能够使用npm模块将输出mp3文件的比特率设置为128kbps,该模块使用ffmpeg,正如u所建议的那样。但是我