我编写了一个小型 nodeJS 服务器,它将 Windows 上 ffmpeg 捕获的系统音频(使用 DirectShow)作为流式 MP3 文件输出到浏览器。音频需要尽可能实时,最小/无缓冲,并且音频中的“跳过”效果是完全可以接受的。
当我使用 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);
}
});