我有一个简单的应用程序来记录音频,并处理正在进入的字节。我发现我错过了很多应该进入的数据,例如2 / 3。
这个例程:
static OSStatus AudioCallBack (void* userData, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, UInt32 nFrames, AudioBufferList* ioData)
的召唤不够。通常会导致什么?
答案 0 :(得分:2)
如果您尝试在音频单元回调中执行任何大量处理(或执行Objective C消息传递,同步,锁定或内存管理等的任何其他操作),则回调函数或块可能需要很长时间,因此您的应用可能会错过一些回调,因此会错过一些音频数据。你可以通过删除回调中的所有处理来检查这一点,并且只收到收到的音频样本总数,以确保每秒都有正确的数量。
如果发生这种情况,那么,为了防止回调阻塞太长时间,您应该重新安排处理以在另一个线程中执行全部或大部分操作,并快速将数据从Audio Unit回调中复制到数组中,队列或fifo传递给其他处理任务或线程。由于您知道音频回调的速率,因此您可以确定要轮询所需处理的正确速率。