在iPhone上录制音频并使用NSOutputStream通过网络发送

时间:2010-03-15 15:44:45

标签: objective-c cocoa core-audio audioqueueservices nsstream

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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