2012-10-26 72 views
3

我已经编写了一个小型nodeJS服务器,它将Windows上使用DirectShow捕获的ffmpeg的系统音频作为流媒体MP3文件输出到浏览器。音频需要尽可能的生动,最小/无缓冲,并且音频中的“跳过”效果是完全可以接受的。Node.js Live Streaming:避免缓存

当我使用HTML5音频标签在Chrome中播放音频时,低延时LAN连接延迟了大约8-10秒。我怀疑这是客户端缓冲区,并在客户端使用了Flash MP3播放器,从而延迟了2-3秒。

现在,缓冲似乎发生在服务器端。 NodeJS的response.write文件提到数据被写入内核缓冲区。我该如何避免完全缓冲或至少绕过它,以便客户端始终获取最新的音频数据?处理“流失”事件以始终推送实时数据的策略?

在请求对象上,我用setNoDelay(true)来避免使用Nagle的算法。以下是生成的ffmpeg进程发出数据时如何写入数据的一段代码。

var clients = []; //List of client connections currently being served 
ffmpeg.stdout.on('data', function(data) { 
    for(var i = 0; i < clients.length; i++){ 
     clients[i].res.write(data); 
    } 
}); 

回答

1

存在其中延迟/缓冲发生几个地方:

  1. DirectShow的捕捉(〜100ms的左右)
  2. FFMPEG MPEG编码缓冲液(1-10秒,取决于配置)
  3. 网络写入和传输(在您的设置中接近0)
  4. 客户端缓冲(因客户端而异,如您所见 - 大多数客户端缓冲约2秒钟解码)

我怀疑你需要看的缓冲区是FFMPEG编码的缓冲区。我已经能够通过确保在执行FFMPEG时明确配置输入格式来减少这种情况。另外,请确保删除用于编码的第一批数据,因为前几位无疑会被延迟超过以后。

一旦你这样做了,你会发现你的延迟是一两秒钟。至少,这是我用类似的设置得到的。

+0

ffmpeg似乎不是我设置中的主要瓶颈。目前局域网的延迟时间约为2-3秒,我试图进一步降低。我会尝试你放弃前几位的建议。谢谢。 –