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

该应用程序使用套接字连接连接到服务器和音频队列服务以进行录制。我不确定何时实际发送数据。音频队列服务每次填充一些音频数据时都会发射回调。 NsoutputStream每次可用空间都会发射事件。

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

然后,我考虑了从音频队列返回数据并每次发送NSOUTPUTSTREAM发射可用空间事件时发送的数据时,请考虑一下数据。但这似乎有问题,如果发送到服务器领先于音频录制,那么在某些情况下将在可用的空间事件上写任何东西,因此该事件不会再次触发,并且数据传输了数据传输将有效地停滞不前。

那么,最好的处理方法是什么呢?我应该有一个计时器反复发射,看看是否有可用空间并且需要发送数据?另外,我认为我需要进行一些线程同步,以便我可以从缓冲区中取出大量数据以在网络上发送,但随着录制进行录制而不会冒险弄脏我的缓冲区,还可以在缓冲区中添加大量数据。

有帮助吗?

解决方案

如果缓冲区超过一定尺寸,则可以使用环缓冲区容纳一定数量的音频帧并丢弃帧。当您的流-HAS空间可用回调被调用时,请从环形缓冲区中摘下框架并将其发送。

哥达塔结构 提供一些弹跳器(称为“圆形缓冲区”)类。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top