将音频从Mac上的麦克风流式传输到iPhone

时间:2011-10-04 19:01:20

标签: iphone macos cocoa audio streaming

我正在开发一个个人项目,其中iPhone连接到Mac上运行的服务器类型的应用程序。 iPhone通过标准套接字发送和接收文本/ ASCII数据。我现在需要将麦克风从Mac流式传输到iPhone。我之前已经完成了一些与AudioServices的合作,但是想要在太深入之前检查我的想法。

我想我可以:
1.在Mac上的标准Cocoa应用程序中创建音频队列 2.在我的音频队列回调功能中,不是将其写入文件,而是将其写入我为音频流打开的另一个插座。
3.在iPhone上,从TCP流接收原始采样/编码音频数据并将其转储到音频队列播放器中,该播放器输出到耳机/扬声器。

我知道这不是一项小任务,我已经大大简化了我需要做的事情,但它可以像那样容易吗?

感谢您提供的任何帮助,
有状态

1 个答案:

答案 0 :(得分:2)

这看起来很明智,但你几乎肯定需要做更多的事情:

  • 缓冲。在“录制”端,如果缓冲区已满,您可能不希望阻止音频队列。在“回放”端,我认为你不能只将缓冲区传递到队列中(IIRC你需要缓冲它直到你得到一个回调)。
  • 并发。我很确定AQ回调发生在他们自己的线程上,所以你需要在缓冲区访问周围设置一些锁定/障碍。
  • 缓冲池,如果内存分配最终成为一个很大的开销。
  • 压缩。 AQ可能会给你“IMA4”帧(IMA ADPCM 4:1,左右);我不确定它是否在iPhone上进行硬件MP3解压缩。
  • 打包,例如,你需要将语音聊天与文字聊天交错。
  • 编辑:播放同步(或任何你应该称之为的)。您需要能够处理不同的有效音频时钟速率,无论是由于延迟的变化还是其他原因。 Skype通过改变播放速度(使用音调校正)来实现它。
  • 编辑:数据包丢失。您可以通过短链接使用TCP,但这在很大程度上取决于无线网络的质量。 UDP是一个很小的痛苦(特别是如果你必须检测一个MTU漏洞)。

根据您的数据速率,可能值得使用较低级别(BSD)套接字API,甚至可能使用readv()/ writev()。

如果你想要的只是一个“在线广播”服务并且你不关心使用的协议,那么使用AVPlayer / MPMoviePlayer来播放来自 URL 的音频可能更容易。这涉及实现一个讲Apple的HTTP流协议的服务器;我相信Apple有一些示例代码可以做到这一点。