iOS音频播放之AudioQueue(一):播放本地音乐

  • Post author:
  • Post category:其他


iOS实现播放本地音乐,有很多种方法,例如AVAudioPlayer,这些都能很好的胜任,有人就奇怪了,为什么要退而求其次,使用更复杂的AudioQueue来播放本地音乐呢?请继续往下看

AudioQueue简介

AudioQueue,在苹果的开发者文档上是这么说的

"Audio Queue Services provides a straightforward, low overhead way to record and play audio in iOS and Mac OS X."


AudioQueue官方文档

AudioQueue服务提供一种直接的,低开销的方式以用于在iOS及Mac OS X上录音和播放音乐。

使用AudioQueue播放音乐的优点就是开销很小并且支持流式播放(边下边播),但是缺点就是开发难度大,所以有网络音频库AudioStreamer,网上有很多讲AudioQueue的,但是有实例代码说明的,实在是少之又少,正好公司项目有音频需求,虽然项目中使用的并非我自己写的音频播放功能,但事后还是想自己来研究一下,这个在我看来比较神奇也比较有趣的AudioQueue。

AudioStreamer说明

iOS上一个比较有名的流媒体音频播放库是AudioStreamer,该库即使用了AudioQueue,不过该音频库并不支持本地音乐播放,我感觉很奇怪,为什么作者不支持。而且在使用过程中,我发现该库还是有点问题,虽然我对音频方面的知识并不怎么了解,也并不能与大师媲美并论,但我也希望通过自己的学习,最终完成一个类似AudioStreamer的网络音乐库,目前也许只是一个设想,不管最后自己有没有那能力,起码我曾经也尝试过,不过工作最近比较忙,加上自己知识的欠缺,不知何时才能实现。本次就先来补上AudioStreamer没有支持的,使用AudioQueue播放本地音乐。

AudioQueue详解

AudioQueue工作原理

我从Apple的官方文档上截下以下该图:

AudioQueue

该图很好的说明了AudioQueue的工作原理,如下说明:

1. 用户调用相应的方法,将音频数据从硬盘中读入到AudioQueue的缓冲区中,并将缓冲区送入音频队列。

2. 用户App通过AudioQueue提供的接口,告诉外放设备,缓冲区中已经有数据,可以拿去播放。

3. 当一个缓冲区中的音频数据播放完毕之后,AudioQueue告诉用户,当前有一个空的缓冲区可以用来给你填充数据。

4. 重复以上步骤,直至数据播放完毕。

到这里,肯定有不少同学发现了,AudioQueue其实就是生产者-消费者模型的典型应用。

AudioQueue主要接口

AudioQueueNewOutput

OSStatus AudioQueueNewOutput(const AudioStreamBasicDescription *inFormat, AudioQueueOutputCal



版权声明:本文为cairo123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。