我正在编写一个iPhone应用程序,它需要从内置麦克风录制音频,然后将音频数据发送到服务器进行处理。
应用程序使用套接字连接来连接到服务器,并使用音频队列服务来进行录制。我不确定的是什么时候真正发送数据。音频队列服务每次用一些音频数据填充缓冲区时都会触发一个回调。NSOutputStream每次有可用空间时都会触发一个事件。
我的第一个想法是通过音频队列回调将数据发送到服务器。但是,如果NSOutputStream当时没有可用的空间,这似乎会遇到问题。
然后,我考虑缓冲从音频队列返回的数据,并在每次NSOutputStream触发可用空间事件时发送一些数据。但是这似乎有一个问题,如果发送到服务器在音频记录之前,那么将存在在可用空间事件上没有可写的情况,因此该事件将不会被再次触发,并且数据传输将被有效地停止。
那么处理这个问题的最好方法是什么呢?我是否应该有一个重复触发的计时器,看看是否有可用的空间以及是否有需要发送的数据?此外,我认为我需要做一些线程同步,以便我可以从我的缓冲区中取出数据块通过网络发送,但也可以在记录进行时将数据块添加到缓冲区中,而不会有损坏缓冲区的风险。
发布于 2010-03-16 00:53:11
您可以使用环形缓冲区来保存一定数量的音频帧,并在缓冲区超过一定大小时丢弃帧。当你的stream-has-space-available回调被调用时,从环形缓冲区中拉出一个帧并发送它。
CHDataStructures提供了一些环形缓冲区(称为“循环缓冲区”)类。
https://stackoverflow.com/questions/2448399
复制相似问题