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