音频队列iOS对象
我正在尝试使用Objective C音频队列iOS对象,ios,core-audio,Ios,Core Audio,我正在尝试使用Objective CAudioToolbox/AudioQueue.h中的音频队列来实时录制和播放声音。我可以让每一个单独工作,但当两个并排运行时,我会遇到问题 如果在输入队列之后启动输出队列,则输入逻辑工作正常,并从麦克风接收数据。调用AudioQueueStart时,输出逻辑失败,OSStatus代码为560034163(!aqs)。这是什么意思?我在网上找不到任何文件,这很令人沮丧 如果在输入队列之前启动输出队列,则输出队列上的AudioQueueStart调用成功。但是,
AudioToolbox/AudioQueue.h中的音频队列来实时录制和播放声音。我可以让每一个单独工作,但当两个并排运行时,我会遇到问题
如果在输入队列之后启动输出队列,则输入逻辑工作正常,并从麦克风接收数据。调用AudioQueueStart
时,输出逻辑失败,OSStatus代码为560034163(!aqs)
。这是什么意思?我在网上找不到任何文件,这很令人沮丧
如果在输入队列之前启动输出队列,则输出队列上的AudioQueueStart
调用成功。但是,输入队列的行为异常,其回调接收所有缓冲区的0数据(如AudioQueueBufferRef->mAudioDataByteSize==0
所示)。我的代码重新调用这些缓冲区,但再也不会收到任何回调
为什么我的输入和输出音频队列会发生这样的冲突?经过多次尝试,我找到了一些答案(至少出于我的目的)
!aqs错误
!aqs
错误似乎与线程有关,或者可能是音频队列API中的通用最后一个错误
防止!aqs
如上所述,我必须确保以同步方式完全设置每个音频队列。以前,我在不同的线程中同时初始化这两个线程;API似乎不是线程安全的,所以按顺序初始化每个API
必须进行完全初始化,例如,对于输出队列,我单独执行以下步骤(我不允许一次执行多个线程):
AudioQueueNewOutput
AudioQueueAllocateBuffer
(适用于所有缓冲区)
audioqueuenbuffer
:必须将数据加载到所有缓冲区中;我试图初始化为0字节(mAudioDataByteSize),但这会导致命令失败。我的应用程序没有可以直接输出的有效数据,所以现在我只是用数据初始化,以避免产生噪音
AudioQueuePrime
AudioQueueStart
:请注意,如果没有缓冲区排队,这可能无法正常工作(我发现情况就是这样)
输入音频队列回调问题
正如我在最初的问题中所描述的,我看到输入音频缓冲区返回时没有数据,然后在某些情况下,回调再也没有调用过
我发现,如果我在调用输出音频队列上的AudioQueueStart
之前调用输入音频队列上的AudioQueueStart
,那么我不会遇到问题。这显然是一个需求,以可选顺序调用它们(先输出)会触发我描述的问题。从哪个线程调用AudioQueueStart
似乎无关紧要。对于初始化音频队列所涉及的其他步骤,线程也是如此。调用AudioQueueStart
(即使是10秒)之间的时间也没有影响
摘要
我想第一个问题是“足够公平”;但我看不到任何不好的地方有记录在案
第二个问题似乎是一个巨大的缺陷,它可能已经并且可能会引起大规模的混乱
从概念上讲,我希望输入和输出音频队列是不相交的,不会受到这些问题的影响;但显然情况并非如此