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

Posted

技术标签:

【中文标题】将音频从 Mac 上的麦克风流式传输到 iPhone【英文标题】:Streaming audio from a microphone on a Mac to an iPhone 【发布时间】:2011-10-04 19:01:19 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

感谢您的想法,tc。你提到了我没有想到的东西。它只是流式传输音频,但缓冲需要低延迟。我读过 Quicktime 流媒体服务器可能会延迟 30 秒,我需要让它接近 1 秒。接近实时,有点像 VoIP 延迟。 在这种情况下,根据连接的糟糕程度,您可能希望使用一种基于 UDP 的协议,该协议具有对数据包丢失的弹性。

以上是关于将音频从 Mac 上的麦克风流式传输到 iPhone的主要内容,如果未能解决你的问题,请参考以下文章

用于从 iphone 麦克风流式传输音频的多点连接

尝试通过多点连接将音频从麦克风流式传输到另一部手机

如何模拟通话以将蓝牙音频流式传输到车辆中?

使用 Java SDK 将音频从麦克风流式传输到 IBM Watson SpeechToText Web 服务

我可以使用 nodejs 将麦克风音频从客户端流式传输到客户端吗?

将麦克风从客户端浏览器流式传输到远程服务器,并将音频实时传递到 ffmpeg 以与第二个视频源结合