首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioQueue iOS ObjectiveC

AudioQueue iOS ObjectiveC
EN

Stack Overflow用户
提问于 2015-03-14 16:53:37
回答 1查看 625关注 0票数 0

我试图使用目标C AudioToolbox/AudioQueue.h中的音频队列来实时记录和播放声音。我可以让每个人单独工作,但当两人并排运行时,我有问题。

如果在输入队列之后启动输出队列,则输入逻辑工作正常,并从麦克风接收数据。输出逻辑在调用AudioQueueStartOSStatus code of 560034163 (!aqs)时失败。这是什么意思?我在网上找不到任何文件,这是非常令人沮丧的。

如果在输入队列之前启动输出队列,那么AudioQueueStart调用将在输出队列上成功。但是,输入队列的行为很奇怪,它的回调为所有缓冲区接收0数据(如AudioQueueBufferRef->mAudioDataByteSize == 0所示)。我的代码请求这些缓冲区,但之后再也不会收到任何回调。

为什么我的输入和输出音频队列会像这样冲突?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-15 22:51:53

在玩了很多次之后,我想出了一些答案(至少对我来说是这样)。

!aqs错误

!aqs错误似乎与线程有关,或者可能是来自音频队列API的最后一种通用错误。

为了防止像上面描述的那样发生!aqs,我必须确保以同步的方式完全设置每个音频队列。以前,我是同时在单独的线程中初始化这两个线程;API似乎并不是线程安全的,所以按顺序初始化每个线程。

必须进行完全初始化,例如,对于输出队列,我孤立地执行以下步骤(我不允许一次执行多个线程):

  1. AudioQueueNewOutput
  2. AudioQueueAllocateBuffer (适用于所有缓冲区)
  3. AudioQueueEnqueueBuffer:必须将数据加载到所有缓冲区中;我试图将数据初始化为0字节(mAudioDataByteSize),但这会导致命令失败。我的应用程序没有可以立即输出的有效数据,所以现在我只是使用数据初始化,这样就不会产生噪音。
  4. AudioQueuePrime
  5. AudioQueueStart:请注意,如果没有缓冲区排队,这可能无法正常工作(我发现情况就是这样)。

输入音频队列回调问题

正如我在最初的问题中所描述的,我看到输入音频缓冲区没有数据返回,然后回调在某些情况下不再被调用。

我发现,如果在对输出音频队列调用AudioQueueStart之前调用输入音频队列上的AudioQueueStart,则不会遇到问题。这显然是一个要求,按替代顺序(输出优先)调用它们会触发我描述的问题。您从哪个线程调用AudioQueueStart似乎并不重要。对于涉及初始化音频队列的其他步骤,线程处理也是如此。调用AudioQueueStart之间的时间(即使是10秒)也没有影响。

摘要

第一个问题是“足够公平”,我想,但我没有看到任何地方的文件,这不是很好。

第二个问题似乎是一个巨大的错误,它可能已经并且很可能会造成大规模的混乱。

从概念上讲,我希望输入和输出音频队列是不相交的,不会受到这些问题的影响;但显然情况并非如此。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29051586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档