音频数据的TCP套接字通信 - 多服务器到多个客户端

时间:2013-10-21 07:48:18

标签: iphone ios sockets audio-streaming

我是socket编程的新手,对它的工作原理并不太了解。这是用例,我正在开发一个iPhone应用程序,用户可以流式传输来自另一个iPhone设备的实时音频(简称Multi casting)

到目前为止我做了什么:

我在服务器上打开了一个端口,它继续监听来自客户端的传入数据。在iOS方面,我实现了读取服务器上收到的数据包并相应处理它的方法(我使用过GCDAsyncSocket)

我需要帮助的问题:

上述用例适用于2个用户,一个用于将音频数据发送到服务器,另一个用于读取数据以播放音频。但实际上并不总是有一个用户发起音频数据,它们可能超过100+,现在当它们都向服务器发送不同的音频数据时,我怎样才能为每个人只收到数据的听众过滤数据,我克服了这个问题,在每个数据包上添加一个令牌,如

unique_token:<ffdefa09 fedead3...... //Audio Data

但是这个过程太慢了,因为每个客户端都在监听所有数据包,只处理带有它们被分配的令牌的数据包。

无论如何,我们可以建立一个点对点连接,通过该点连接,始发设备成为服务器并且只将数据发送给其监听器而不打扰其他任何人?

3 个答案:

答案 0 :(得分:1)

在开始将音频数据传输到服务器之前,是否无法添加类似光协议的内容?

iPhone -> server [Request: Start Stream Audio]
server -> iPhone [OK: TCP Port:4444]
// iphone sending audio packets to port 4444


iPhone2 -> server [Request: Start Stream Audio]
server -> iPhone2 [OK: TCP Port:4445]

然后服务器可以使用TCP端口ID而不是数据包ID过滤所有音频通道(或者我可能误解了您的问题)

顺便说一句,由于提供商的防火墙,我认为你不能在蜂窝网络上用iPhone做任何“真正的”P2P

答案 1 :(得分:1)

对于发送音频数据的每一端,您创建套接字和recv音频数据,并且对于接收音频数据的每一端,您创建套接字并发送音频数据。 P2P是很多工作,因为很多设备都在公共地址之后。

答案 2 :(得分:1)

您需要将您的命令数据与流/音频数据分开。

首先,您需要iphone告诉服务器他们想要什么,

  • iphone 1:“我想用id 1”
  • 传输这些数据
  • iphone 2:“我想用id 1来听流”

通过这种方式,服务器可以告诉iphone在哪里连接以获取所需的数据,正如HaneTV建议的端口号