2010-03-15 41 views
2

我正在编写一个iPhone应用程序,需要从内置麦克风录制音频,然后将该音频数据发送到服务器进行处理。在iPhone上录制音频并使用NSOutputStream发送网络

应用程序使用套接字连接来连接服务器和音频队列服务来进行录制。我不确定的是何时实际发送数据。音频队列服务在每次用一些音频数据填充缓冲区时触发回叫。 NSOutputStream每次有可用空间时触发一个事件。

我的第一个想法是将数据发送到服务器上的音频队列回调。但是,如果NSOutputStream当时没有可用空间,它似乎会遇到问题。

然后我考虑缓冲从音频队列返回的数据,并在每次NSOutputStream触发可用空间事件时发送一些数据。但是,如果发送到服务器领先于音频记录,则这似乎有问题,那么将会出现空间可用事件没有任何内容可写的情况,因此事件不会再次被触发,数据传输将有效地停滞。

那么处理这个问题的最好方法是什么?我是否应该有一个重复触发的计时器,看看是否有可用空间,并且有数据需要发送?另外,我认为我需要进行一些线程同步,以便我可以从我的缓冲区中将大量数据发送到网络中,但是随着记录的进行,将数据块添加到缓冲区,而不会冒着损坏缓冲区的风险。

回答

3

如果缓冲区超过特定大小,您可以使用环形缓冲区来保存特定数量的音频帧并丢弃帧。当你的stream-has-space-available回调被调用时,将一个帧从环形缓冲区中取出并发送。

CHDataStructures提供了一些环缓冲区(它称之为“循环缓冲区”)类。

+0

感谢Peter,我之前没有遇到过这些数据结构。看起来这可能是有用的,虽然我在服务器端进行语音识别,所以我不知道我可以在不影响准确性的情况下安全丢弃帧。你知道objective-c的线程安全队列结构吗?我一直在环顾四周,没有找到任何东西。也许我必须写我自己的。 – 2010-03-15 17:26:59

+0

我不知道关于我链接到的框架中的类的线程安全性。你应该阅读它的文档,看看它说什么。 – 2010-03-15 17:30:13

+0

@PeterHosey你能解释我如何将数据从回调函数发送到服务器吗?我无法理解如何在该回调函数中编写obj-c代码以从缓冲区提取音频数据并将其发送到服务器 – 2012-03-15 10:05:13