Raspberry pi 我应该使用RTP或WebRTC进行本地网络音频通信吗

Raspberry pi 我应该使用RTP或WebRTC进行本地网络音频通信吗,raspberry-pi,webrtc,rtp,Raspberry Pi,Webrtc,Rtp,我有一套树莓皮零,我想作为一个家庭对讲机使用。我最初将它们设置为使用golang与gRPC和双向流媒体相互发送音频,这适用于短通话,但随着时间的推移,延迟会逐渐增加,因此我认为需要切换到实时协议,如RTP或WebRTC。因为我已经知道每个设备的IP地址,每个设备的硬件/支持的编解码器都是相同的,并且它们都在同一个网络上,所以使用WebRTC比使用普通RTP有什么优势吗?我的理解是WebRTC主要提供一些额外的安全性和连接编排,如ICE和SDP,我不一定需要它们。我正在尽量减少资源使用,因为这些设

我有一套树莓皮零,我想作为一个家庭对讲机使用。我最初将它们设置为使用golang与gRPC和双向流媒体相互发送音频,这适用于短通话,但随着时间的推移,延迟会逐渐增加,因此我认为需要切换到实时协议,如RTP或WebRTC。因为我已经知道每个设备的IP地址,每个设备的硬件/支持的编解码器都是相同的,并且它们都在同一个网络上,所以使用WebRTC比使用普通RTP有什么优势吗?我的理解是WebRTC主要提供一些额外的安全性和连接编排,如ICE和SDP,我不一定需要它们。我正在尽量减少资源使用,因为这些设备没有电话或桌面那么强大。如果我确实使用WebRTC,我可以使用gRPC或其他直接交付方法执行SDP信令。由于有两个以上的设备,我也对多播功能感兴趣,这似乎是纯RTP特定的,而WebRTC(使用RTP)不一定支持多播,并且需要
(n-1)p2p连接。我对这一点很不清楚/不确定


另外,您是否支持本机混合音频频道,或者需要在自定义软件中处理这些频道?

您可以使用WebRTC,但需要装配、和。这些可以是超级简单和低容量的,因为所有东西都在专用网络上,但您仍然需要它们。信令服务器处理必要的SDP交换。完全使用WebRTC可能是过度工程化了。(当然,学习如何让WebRTC正常工作也很有用。)

你已经建立了一个golang基础设施。鉴于您在专用网络上的情况,您可以将该程序更改为发送多播UDP数据包或RTP数据包。然后你可以训练你的听众去听他们

无论你做什么,你都需要处理滞后问题。在数据包世界中这样做的一个好方法是:不要构建一个准备好播放的缓冲区队列。相反,始终将每个接收到的数据包作为下一个要播放的数据包,即使您必须覆盖以前接收到的数据包。(也就是说,跳到前面。)你可能会偶尔收到一次pop,但如果数据包比较短,在50毫秒以下,则不会显著影响用户体验。而且这种滞后不会累积

老式的电话系统运行在一个覆盖整个大陆的8K同步时钟上。因此,滞后不是问题。但当音频模拟到数字和数字到模拟时钟不同步时,这总是一个问题。这是真的,只要他们在不同的设备上。随着时间的推移,轻微的漂移会逐渐累积。(RPI中没有保证低漂移的50美元时钟部件。)


如果所有音频源都以相同的采样率运行,则可以对它们进行平均以混合。这应该让你开始。(如果您在浏览器中使用WebRTC,它将为您混合多个源。)

因为您使用的是Go check out。这样就不需要发信号和晕眩/转弯。它使用MDN和预生成的证书。它也正在不知道是否/何时着陆的讨论中

“滞后”是通过TCP进行媒体传输时经常遇到的问题。你正在处理大量的队列和拥塞控制。WebRTC(以及通常的RTP)非常擅长解决这个问题。你有以下标准化的东西来解决它

  • RTP数据包具有相对时间戳
  • RTP发送方报告具有相对NTP时间戳的映射。用于同步/定时
  • RTP接收器报告提供数据包丢失/抖动。使用此选项可断言您的网络运行状况
多播也是一个很棒的建议。您减少了向所有这些1:1连接发送信号的复杂性,并减少了所需的带宽。不过,它确实让安全性变得更为微妙了

使用π介子,我们将所有RTP/RTCP内容解耦。因此,您不必使用完整的WebRTC堆栈来获取上面提到的媒体传输内容