繁体   English   中英

实时音频对话iOS

[英]Real time audio conversation iOS

我正在为希望允许用户之间实时(最小延迟,最长50毫秒)对话的客户设计一个iOS应用程序(一种Teamspeak)。 滞后必须很低,因为音频也可以是现场音乐,用乐器演奏,所以所有用户都需要同步。 我需要一台服务器,它会向每个客户端请求录音并发送给其他人(并让他们同时听到相同的声音)。 HTTP易于管理/实现且易于扩展,但性能非常低,因为平均HTTP请求需要> 50ms ...(使用中级硬件),所以我在考虑在客户端之间保持打开的TCP / UDP连接和服务器。 但我有一些问题:

  • 如果我用Python开发服务器(例如使用TwistedMatrix),它的性能如何?
  • 我不能用C ++开发服务器,因为它很难管理(可扩展)和开发。
  • 任何人都使用Nodejs(易于扩展)来管理TCP / UDP连接?
  • 如果我使用HTTP,它是否足够快与Keep-Alive? 因为通常执行HTTP请求所需的时间大于50毫秒(因为打开 - 关闭连接很难),并且我希望总程序小于该时间。
  • 服务器将在Linux机器上运行。

最后:你能建议我使用哪种压缩方式? 我认为Ogg Vorbis会很好,但如果有更好的东西(并且可以在iOS中使用),我愿意接受改变。

谢谢你,奥马尔。

与服务器有什么关系,请求本身不是瓶颈。 我猜你有足够的时间来建立连接,因为它只在会话开始时发生。 因此,该协议没有多大意义。

但请考虑HTTP是无状态协议,不适合音频流。 您可以选择几种实时流媒体协议。 所有这些都可以通过TCP或UDP工作(例如使用原始套接字),并且有很多实现。

在您的情况下,延迟的瓶颈不是服务器而是网络本身。 如果AP配置错误且连接良好,则iOS设备和无线接入点(AP)之间的连接会耗尽大约40毫秒。 (ping你的iPhone。)总的来说,路径iOS - > AP - > Server - > AP - > iOS总共至少有80ms。 但是很难保持这种延迟稳定。 (我本地网络上AirPlay的典型延迟时间约为300毫秒。)

我认为iOS设备上的现场音乐今天不可行。 尝试两个iOS设备之间的Skype,看看你有多接近50毫秒。 我敢打赌,没有人可以做得更好,有什么关系延迟。

更新:新的研究成果!

我必须修改关于iDevice的wifi连接延迟的声明。 显然,当您第一次ping您的设备时,延迟会很糟糕。 但是如果我在不迟于200ms之后再次ping通,我会看到AP和iDevice之间的平均延迟为2ms-3ms。

我的解释是,如果AP和iDevice之间没有通信超过200ms,iDevice的网络适配器将进入反应较慢的睡眠模式,可能是为了节省电池电量。

所以看来,现场音乐再次触手可及...... :-)

更新2

保持低延迟所需的ping间隔显然因设备而异。 报道的200毫秒是第三代。 iPad兼容。 对于我的iPhone 4,它更像是50ms。

虽然流媒体音频你可能不需要为此烦恼,因为数据的交换频率更高。 在我自己的上下文中,我在iDevice和服务器之间进行稀疏通信,但低延迟是至关重要的。 因此,保持活力是可行的方法。

最好,彼得

首先,您不会获得低于50毫秒的延迟。 其他人试过这个。 例如,参见http://ejamming.com/这是一项试图做你正在做的事情的服务,但是在线路上有一个音乐明显的延迟,因此,在许多人看来,它完全无法使用。 他们使用特殊的路由技术来尽可能降低延迟,最后我听说他们的服务不适用于某些路由器配置。

其次,你在服务器上使用的语言可能没什么区别,因为从客户端到服务器的延迟将比你的服务造成的任何延迟更糟,但如果我理解你的服务正确,你将需要大量的服务器(或服务器线程)只是在客户端之间中继音频数据或进行某种最小程度的混合。 这是每个连接的少量工作,但是很多连接,所以你需要能够处理它的东西。 我倾向于像Java,Scala或者Go这样的东西。 我可能是错的,但我认为这不是一个很好的节点用例,据我所知,它目前还不能很好地进行多线程处理。 另外,不要poo-poo C ++,可扩展服务已经构建了C ++。 您还可以使用C ++构建服务的中继部分,其余部分也可以构建。

第三,在选择压缩格式时,如果计划使用UDP,则必须选择能够在丢包中幸存的格式,我认为UDP是唯一可行的方法。 我不认为vorbis能胜任这项任务,但我可能错了。 在我的头脑中,我不确定在iPhone上有什么作用并且是UDP友好的,但我确信有很多东西。 Speex就是一个例子,是开源的。 不确定延迟和质量是否满足您的需求。

最后,说实话,我认为还有其他事情你应该再研究一下。 例如。 DNS通常在本地缓存,而不是每次http调用都检查(尽管它可能取决于系统/库。至少大多数系统在本地缓存dns)。 此外,没有TCP / UDP这样的协议。 有TCP / IP(有时称为TCP)和UDP / IP(有时称为UDP)。 你似乎把它们称为两者。 差异对于你正在做的事情非常重要。 例如,HTTP运行在TCP之上,而不是UDP,UDP被认为是“不可靠的”,但开销较少,因此它对流式传输很有用。

编辑:speex

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM