iOS 音频队列

举报
billchan 发表于 2018/12/22 18:30:09 2018/12/22
【摘要】 介绍要在 iOS 设备上播放和录制音频,苹果推荐我们使用 AVFoundation 框架中的 AVAudioPlayer和 AVAudioRecorder 类。虽然用法比较简单,但是不支持流式;这就意味着:在播放音频前,必须等到整个音频加载完成后,才能开始播放音频;录音时,也必须等到录音结束后,才能获取到录音数据。这给应用造成了很大的局限性。为了解决这个问题,我们就需要使用 Audio Qu...

介绍

要在 iOS 设备上播放和录制音频,苹果推荐我们使用 AVFoundation 框架中的 AVAudioPlayer和 AVAudioRecorder 类。虽然用法比较简单,但是不支持流式;这就意味着:在播放音频前,必须等到整个音频加载完成后,才能开始播放音频;录音时,也必须等到录音结束后,才能获取到录音数据。这给应用造成了很大的局限性。为了解决这个问题,我们就需要使用 Audio Queue Services来播放和录制音频;为了简化音频文件的处理,这里还需要用到 Audio File Services 。

工作原理

输入

  1. 将音频填入第一个缓冲器中;

  2. 当队列中的第一个缓冲器填满时,会自动填充下一个缓冲器。此时,会触发回调;

  3. 在回调函数中需要将音频数据流写入磁盘;

  4. 然后,需要在回调函数中将该缓冲器重新放入缓冲队列,以便重复使用该缓冲器。重复步骤2。

输出

  1. 将音频读入到缓存器中。一旦填充满一个缓存器,就会进入缓存队列,此时处于待命状态;

  2. 应用程序命令发出指令,要求音频队列开始播放;

  3. 音频会从第一个缓存器中取数据,并开始播放;

  4. 一旦播放完成,就会触发回调,并开始播放下一个缓存器中的内容;

  5. 回调中需要给该缓存器取后面的音频数据,然后重新放入缓存队列中。重复步骤3。

当然,要明白音频队列服务的原理并不难,问题是如何实现这个自定义的回调函数,这其中我们有大量的工作要做,控制播放状态、处理异常中断、进行音频编码等等。(由于自己实现做的东西还真不少,所以推荐第三方框架: AudioStreamerFreeStreamer。)

参考


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。