【问题标题】:Socket.io latency issueSocket.io 延迟问题
【发布时间】:2018-02-25 11:37:05
【问题描述】:

我创建了对讲机/对讲机,用户可以在其中进行单向通信。音频字节是实时广播的。

我正面临网络延迟问题。在本地网络中它工作正常,但在实时网络上它会出现故障。

以下是与之相关的信息。请建议优化延迟的正确方法。

以下是广播字节的代码:

socket.on('talk', function (data) {
    io.emit('listen', data);  
});

每秒采样率:44100 Hz

缓冲区大小:1024

在移动端我有以下速度:

0.49 Mbps 下载

0.88 Mbps 上传

我的网速如下,这是我托管socket.io nodejs服务的服务器,我从外部网络连接套接字:

【问题讨论】:

  • 网络 延迟是您无法影响的(除非您更改提供商)。 应用程序延迟在你手中(意味着你的应用程序编码/解码声音数据的速度)。您提到了 44100Hz 的采样率,这对于语音来说似乎很高,减少它也会减少您发送的数据量。增加缓冲区大小是另一种选择,因此您的应用可以在每个周期处理更长的数据块。
  • 您是在压缩音频数据还是仅压缩原始样本?你编码了多少个通道(IE:单声道或立体声)?您的样本深度是多少(IE:16 位)?
  • 它是立体声,不压缩,是原始样本。

标签: node.js nginx socket.io network-programming


【解决方案1】:

网络延迟是您无法影响的(除非您更改您的 ISP)。但是应用程序延迟掌握在您手中(意味着您的应用程序对声音数据进行编码/解码所需的速度)。

  • 您提到了 44100Hz 的采样率,这对于语音来说似乎太高了。减少它也会减少您发送的数据量。

  • 增加缓冲区大小(缓存)是另一种选择,因此您的应用程序可以在每个周期处理更长的数据块。这增加延迟,但会提供更稳定的整体通信

  • 您可以考虑从 TCP 切换到 UDP 传输层协议,去掉 ACK 数据包,从而提高吞吐量。如果您打算将您的应用程序用作实时语音通信工具,则会丢失一些语音数据包(与传统的电路相比,Internet 等数据包交换网络的不可避免部分-已切换的固定电话网络),然后重新捕获它们并没有用,因为对话继续进行

  • 谈到不可避免或不可避免的损失,您可以考虑在不损失质量(无损)的情况下压缩音频。示例格式有:FLAC、ALAC 和 WAV。有损(有质量损失)格式(例如 MP3)的性能甚至要好 10-100 倍,通常几乎没有明显的质量损失,这可能是一个可行的选择(想想看,你有没有注意到 MP3 有任何质量损失吗?)

  • 最后,大致了解一下其他流行的系统和服务(例如 Skype、Discord、Slack 或 Spotify)如何解决您的问题,或许可以考虑应用它们应用的一些已知技术。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多