我正在尝试通过 GKSession 将音乐从一台设备流式传输到另一台设备,以使音乐完全同步。到目前为止,我知道如何使用它来获取音频,但我不确定一些事情。我很确定我必须使用 AudioFileReadPackets 来传输数据。
- 我应该如何将内存缓冲区中的数据包数据打包并作为流发送?
- 另一方面,如何将接收到的数据包转换回音频流?
- 确保数据包同步播放的最佳方法是什么?
重要更新: 我刚刚在 github 上创建了一个repo,它几乎可以满足您的要求。一探究竟!
以下是我的旧答案:
一个。首先你想从你的音乐中获取音频缓冲区数据,类似于我在 github 项目中所做的。
湾。您想要获取这些数据并将其分成数据包,每个数据包都包含标头信息,您稍后将使用这些信息来管理它们的传递并确保它们被同步。因此,例如每个数据包的时间戳、它的顺序、音乐文件哈希等。看到这个答案以获得一个想法,然后看看这个优秀的教程,它详细向你展示了如何打包一个数据包任何目的。
在网络的另一端,您以与打包非常相似的方式解包数据包。再次参考上面详细讨论如何做到这一点的教程。
这是最难的部分。幸运的是,您只处理两个设备..所以您可以使用 GKSession 来完成.. 否则您将不得不降低一个级别(即使用 bonjour.. 至尊 GKSession 是...的包装器,这会增加很多开销你买不起实时应用程序..但不要惊慌..这本书有一个很好的简单例子来使用 bonjour..)
这个想法是你想在另一端收集足够的数据包来填充音频队列缓冲区,然后你想发送一个不可靠的数据包(读取:udp 协议)来开始播放音乐。使用 udp 发送,它几乎是即时交付的(我认为人耳不会区分两个设备之间的延迟).. 偶尔会丢失一个不可靠的数据包.. 所以你必须要么活着用它或想办法处理它。
最后但并非最不重要的一点是,您肯定想获取一份学习核心音频的副本.. 任何在 iOS 中做核心音频的人都需要这个。还请查看此答案之后的讨论。当涉及到核心音频/实时 iOS 应用程序时,它将使您注意许多要处理的事情。
祝你好运!