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

3
我正在进行一个个人项目,其中iPhone连接到在Mac上运行的服务器类型应用程序。 iPhone通过标准套接字发送和接收文本/ ASCII数据。现在我需要从Mac向iPhone流传麦克风声音。我以前使用过AudioServices进行过一些工作,但在深入之前想要检查一下我的想法。
我考虑可以:
1.在Mac上的标准Cocoa应用程序中创建一个音频队列。
2.在我的音频队列回调函数中,将其写入另一个我为音频流打开的套接字,而不是写入文件。
3.在iPhone上,从TCP流接收原始采样/编码音频数据,并将其转储到音频队列播放器中,输出到耳机/扬声器。
我知道这不是一项小任务,我已经大大简化了我需要做的事情,但它可能真的那么容易吗?
谢谢您提供的任何帮助, Stateful
1个回答

2
这看起来大体上是合理的,但你几乎肯定需要做更多的事情:
- 缓冲。在“录制”端,如果缓冲区已满,你可能不想阻塞音频队列。在“播放”端,我认为你不能只是将缓冲区传递到队列中(如果我没记错的话,你需要缓冲它直到得到回调)。 - 并发性。我很确定AQ回调会在它们自己的线程上发生,所以你需要在缓冲区访问周围使用某种形式的锁/屏障。 - 缓冲池,如果内存分配最终成为一个重要开销。 - 压缩。AQ也许能够给你“IMA4”帧(IMA ADPCM 4:1之类的),我不确定它是否在iPhone上进行硬件MP3解压缩。 - 分组,例如,如果你需要将语音聊天与文本聊天交错。 - 播放同步(或者你应该称之为什么)。你需要能够处理不同的有效音频时钟速率,无论是由于延迟的变化还是其他原因。Skype通过改变播放速度(具有音高校正)来实现这一点。 - 数据包丢失。你可能可以在短链路上使用TCP,但这在很大程度上取决于你的无线网络质量。UDP很难实现正确(特别是如果你必须检测MTU漏洞)。
根据你的数据速率,使用更低级别(BSD)的套接字API并可能甚至使用readv()/writev()可能是值得的。
如果你只想要一个“在线广播”服务,而且你不在乎所使用的协议,那么使用AVPlayer/MPMoviePlayer从URL播放音频可能更容易。这涉及到实现一个支持苹果HTTP流媒体协议的服务器;我相信苹果有一些示例代码可以做到这一点。

谢谢你的想法,tc。你提到了一些我没有想到的东西。虽然只是流媒体音频,但需要低延迟进行缓冲。我读过Quicktime流媒体服务器可能会有30秒的延迟,我需要把它缩短到1秒左右。近乎实时,就像VoIP延迟一样。 - Stateful
在这种情况下,根据连接的质量如何,您可能希望使用基于UDP的协议,该协议对数据包丢失具有弹性。 - tc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接