* 因为公司一个蓝牙项目的需求,需要拿到通过 ble 传送过来的音频文件,然后转成可播放的音频文件。查了一下,发现可以直接用 Audio Queue 的服务直接转,但有一个限制是你传过来的音频文件必须是 pcm 格式的。如果是其他格式的就需要配合 AudioFileStream 或者 AudioFile 解析后播放。*
因为比较着急的原因,所以也没展开去好好了解 Audio Queue,就着急上马的用上了里面的东西。不过这里给大家推荐一个写的比较详细的博客系列:iOS音频播放
使用逻辑:
1. Audio Queue Service 的播放模式是先配置好播放的参数,然后开几个播放队列,相当于缓冲队列,初始化队列会要求填写缓冲队列的大小,后面填充的时候不要超过这个大小,不然会导致内存溢出。 2. 此时往缓冲队列插入音频(PCM)数据,再把队列填充进 Audio Queue Service 中,然后启动Audio Queue Service,此时 Audio Queue Service 会播放(消费)这个数据。 3. 当播放完这段数据后,Audio Queue Service调用一个方法,这个方法在你初始化(AudioQueueNewOutput)时,会要求填写这个方法,这个方法包含了你当初设置的数据,默认是当前对象,还有一个 Audio Queue Service 对象和一个消费完的缓冲对象,此时你可以对比你的缓冲对象对象列表,把这个对象设置为未使用状态,重新填充数据,然后在反复操作,直到音频播放完成。
注意点:• 当发现音频播放吵杂,播放过快(慢)时,可以检查你的采样率(khz)和采样位数设置的可能和音频的采样率和采样位数不同。 • 当发现播放一会之后没有声音,检查是不是你的生产者(音频来源)提供的数据不足,导致消费者(播放)在中断后即使有数据也不播放(Audio Queue Service 尿性)。
上述的解决办法是往播放队列中插入空数据(感觉效果不好),或者是先暂停后,等数据来了再播放。
AudioQueuePlay.h
1 | // |
AudioQueuePlay.m
1 | // |