在 iPhone 上录制音频并使用 NSOutputStream 通过网络发送
Posted
技术标签:
【中文标题】在 iPhone 上录制音频并使用 NSOutputStream 通过网络发送【英文标题】:Recording Audio on iPhone and Sending Over Network with NSOutputStream 【发布时间】:2010-03-15 15:44:45 【问题描述】:我正在编写一个 iPhone 应用程序,它需要从内置麦克风录制音频,然后将该音频数据发送到服务器进行处理。
应用程序使用套接字连接连接到服务器并使用音频队列服务进行录制。我不确定何时实际发送数据。音频队列服务每次在缓冲区中填充一些音频数据时都会触发回调。 NSOutputStream 每次有可用空间时都会触发一个事件。
我的第一个想法是在音频队列回调中将数据发送到服务器。但是,如果当时 NSOutputStream 没有可用空间,这似乎会遇到问题。
然后我考虑缓冲从音频队列返回的数据,并在每次 NSOutputStream 触发可用空间事件时发送一些数据。但是,如果发送到服务器的时间早于录音,这似乎会出现问题,那么就会出现在可用空间事件上没有可写的情况,因此不会再次触发该事件并且数据传输将有效地停止。
那么处理这个问题的最佳方法是什么?我是否应该有一个重复触发的计时器并查看是否有可用空间以及需要发送的数据?另外,我认为我需要进行一些线程同步,以便我可以从缓冲区中取出数据块以通过网络发送,但也可以在录制进行时将数据块添加到缓冲区,而不会冒损坏缓冲区的风险。
【问题讨论】:
【参考方案1】:您可以使用环形缓冲区来保存一定数量的音频帧,并在缓冲区超过一定大小时丢弃帧。当您的 stream-has-space-available 回调被调用时,从环形缓冲区中拉出一个帧并发送它。
CHDataStructures 提供了一些环形缓冲区(它称之为“循环缓冲区”)类。
【讨论】:
谢谢彼得,我以前没有遇到过这些数据结构。尽管我在服务器端进行语音识别,但这似乎很有用,所以我不知道我可以在不影响准确性的情况下安全地丢帧。你知道objective-c的线程安全队列结构吗?我一直在环顾四周,没有找到任何东西。也许我必须自己写。 我不知道我链接到的框架中的类的线程安全性。你应该阅读它的文档,看看它是怎么说的。 @PeterHosey 你能解释一下你是如何将数据从回调函数发送到服务器的吗?我无法理解如何在该回调函数中编写 obj-c 代码以从缓冲区中提取音频数据并将其发送到服务器 @JavalNanda:你应该问一个单独的问题。以上是关于在 iPhone 上录制音频并使用 NSOutputStream 通过网络发送的主要内容,如果未能解决你的问题,请参考以下文章