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

标签 iphone macos cocoa audio streaming

我正在开发一个个人项目,其中 iPhone 连接到在 Mac 上运行的服务器类型应用程序。 iPhone 通过标准套接字发送和接收文本/ASCII 数据。我现在需要将麦克风从 Mac 传输到 iPhone。我之前曾使用 AudioServices 做过一些工作,但想在深入研究之前先检查一下我的想法。

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

我知道这不是一个小任务,我已经大大简化了我需要做的事情,但它能这么简单吗?

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

最佳答案

这看起来很合理,但您几乎肯定需要做更多事情:

  • 缓冲。在“录制”端,如果缓冲区已满,您可能不希望阻塞音频队列。在“播放”端,我认为您不能只将缓冲区传递到队列中(IIRC,您需要对其进行缓冲,直到收到回调)。
  • 并发。我非常确定 AQ 回调发生在它们自己的线程上,因此您需要在缓冲区访问周围进行某种锁定/屏障。
  • 缓冲池,如果内存分配最终会产生很大的开销。
  • 压缩。 AQ 可能能够为您提供“IMA4”帧(IMA ADPCM 4:1 等);我不确定它是否在 iPhone 上进行硬件 MP3 解压缩。
  • 打包,例如您需要将语音聊天与文本聊天交织在一起。
  • 编辑:播放同步(或者无论你如何调用它)。您需要能够处理不同的有效音频时钟速率,无论是由于延迟变化还是其他原因。 Skype 通过改变播放速度(通过音调校正)来实现这一点。
  • 编辑:数据包丢失。您也许可以通过短链路使用 TCP,但这在很大程度上取决于无线网络的质量。 UDP 的正确性比较小(特别是当您必须检测 MTU 漏洞时)。

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

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

关于iphone - 将音频从 Mac 上的麦克风流式传输到 iPhone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7652784/

相关文章:

iphone - UITableview titleForHeaderInSection 显示不正确

ios - Xcode:通用框架:仅针对特定平台有条件地链接其他 .framework 依赖项

ios - UIButton 中的内容在动画之后移动

objective-c - NSPathControl 和自动布局

iphone - 如何以编程方式使铃声静音或更改 iOS5 上的铃声

iphone - Storyboard奇怪的 Controller View 框架起源

python - 在 python 2.7.6 下安装 PyX

macos - 我们可以在 mac OS X 中创建 asp 5 应用程序而不使用 mono 吗?

objective-c - 如何在cocoa(Interface Builder)中绑定(bind)CGSize.width?

ios - iPhone 中的总内存