Core Audio - CARingBuffer读取音频文件以进行回调

时间:2011-03-24 04:58:59

标签: iphone audio callback core-audio

有没有人有一个使用CARingBuffer来缓冲大型音频文件以及如何在回调中读取它的好例子?

是否应该在辅助线程中读取音频文件?如何暂停加载音频文件,直到播放加载的缓冲区为止(如何预先对音频文件进行排队)? CAPlayThrough似乎很接近但只是从麦克风流式传输音频。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您下载book 学习核心音频 here的示例代码(在下载 tab)。跳转到名为CH08_AUGraphInput的文件夹中的第8章示例。

但是,如果您只是从文件中读取音频,那么使用(额外的)环形缓冲区似乎是一种过度杀伤。当您有实时(或接近实时)输入和输出时,环形缓冲区会派上用场(请阅读上述书中的第8章,了解何时需要使用环形缓冲器的详细说明..请注意,第8章中的示例是关于在用麦克风录制音频后立即播放音频,这不是您想要做的)。

我之所以说额外的环形缓冲区,是因为在核心Audio中已经存在一个音频队列(可以被认为是一个环形缓冲区......或者至少在你的情况下它取代了对环形缓冲区的需求) :您使用数据填充它,它会播放数据,然后触发一个回调,通知您已提供的数据已被播放)。苹果documentation对此提供了很好的解释。

在您的情况下,如果您只是从文件中读取音频,则可以轻松控制文件中音频的吞吐量。例如,您可以通过阻止从音频文件中读取数据的线程来暂停它。

有关我正在谈论的一个简单示例,请参阅我在github上创建的example。有关更高级的示例,请参阅Matt Gallagher着名的example

答案 1 :(得分:1)

通常,对于音频播放,任何可以阻止或占用无限时间(特别是文件或磁盘IO)的内容都应该在辅助线程中完成。因此,您希望在生产者线程中读取音频文件的数据,并使用IOProc或RemoteIO回调中的数据。

同步成为多线程的问题,但如果你只有一个阅读器和一个编写器通常不太难。事实上,对于这种情况,CARingBuffer是线程安全的。

一般流程应如下所示:

从主线程:

  1. 创建生产者线程
  2. 告诉它要处理哪个文件
  3. 来自制作人主题:

    1. 打开指定的文件
    2. 使用音频数据填充环形缓冲区中的空白区域
    3. 等到发出信号或发生超时,然后返回#2
    4. 在你的IOProc /回调中:

      1. 从环形缓冲区中读取数据
      2. 告知生产者需要更多数据
      3. 在这里发布代码要花太长时间阅读,但这里有一些指导可以帮助您入门。这些都不适用于iPhone,但原则是相同的。