有没有人有一个使用CARingBuffer来缓冲大型音频文件以及如何在回调中读取它的好例子?
是否应该在辅助线程中读取音频文件?如何暂停加载音频文件,直到播放加载的缓冲区为止(如何预先对音频文件进行排队)? CAPlayThrough似乎很接近但只是从麦克风流式传输音频。
谢谢!
答案 0 :(得分:2)
如果您下载book 学习核心音频 here的示例代码(在下载下),您可以找到使用此环形缓冲区的示例em> tab)。跳转到名为CH08_AUGraphInput的文件夹中的第8章示例。
但是,如果您只是从文件中读取音频,那么使用(额外的)环形缓冲区似乎是一种过度杀伤。当您有实时(或接近实时)输入和输出时,环形缓冲区会派上用场(请阅读上述书中的第8章,了解何时需要使用环形缓冲器的详细说明..请注意,第8章中的示例是关于在用麦克风录制音频后立即播放音频,这不是您想要做的)。
我之所以说额外的环形缓冲区,是因为在核心Audio中已经存在一个音频队列(可以被认为是一个环形缓冲区......或者至少在你的情况下它取代了对环形缓冲区的需求) :您使用数据填充它,它会播放数据,然后触发一个回调,通知您已提供的数据已被播放)。苹果documentation对此提供了很好的解释。
在您的情况下,如果您只是从文件中读取音频,则可以轻松控制文件中音频的吞吐量。例如,您可以通过阻止从音频文件中读取数据的线程来暂停它。
有关我正在谈论的一个简单示例,请参阅我在github上创建的example。有关更高级的示例,请参阅Matt Gallagher着名的example。
答案 1 :(得分:1)
通常,对于音频播放,任何可以阻止或占用无限时间(特别是文件或磁盘IO)的内容都应该在辅助线程中完成。因此,您希望在生产者线程中读取音频文件的数据,并使用IOProc或RemoteIO回调中的数据。
同步成为多线程的问题,但如果你只有一个阅读器和一个编写器通常不太难。事实上,对于这种情况,CARingBuffer是线程安全的。
一般流程应如下所示:
从主线程:
来自制作人主题:
在你的IOProc /回调中:
在这里发布代码要花太长时间阅读,但这里有一些指导可以帮助您入门。这些都不适用于iPhone,但原则是相同的。