2

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

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

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

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

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

4

1 回答 1

3

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

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

于 2010-03-15T16:53:11.237 回答