gpt4 book ai didi

Node.js 直播 : Avoid buffering

转载 作者:搜寻专家 更新时间:2023-11-01 00:03:01 25 4
gpt4 key购买 nike

我编写了一个小型 nodeJS 服务器,它可以将 ffmpeg 在 Windows 上(使用 DirectShow)捕获的系统音频作为流式 MP3 文件输出到浏览器。音频需要尽可能生动,缓冲最少/无缓冲,并且音频中的“跳跃”效果是完全可以接受的。

当我在 Chrome 中使用 HTML5 音频标签播放音频时,在低延迟 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. DirectShow 捕获(~100 毫秒左右)
  2. FFMPEG MPEG 编码缓冲区(1-10 秒,取决于配置)
  3. 网络写入和传输(在您的设置中接近 0)
  4. 客户端缓冲(如您所见,因客户端而异 - 大多数客户端缓冲约 2 秒用于解码)

我怀疑您需要查看的缓冲区是用于 FFMPEG 编码的缓冲区。我已经能够通过确保在执行 FFMPEG 时显式配置输入格式来减少这种情况。此外,请确保丢弃第一个数据 block 以进行编码,因为第一位无疑会比后面延迟更多。

完成此操作后,您会发现延迟是一两秒。至少,这就是我通过类似设置得到的结果。

关于Node.js 直播 : Avoid buffering,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13081609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com