ios - Core Audio 大型(压缩)文件播放和内存占用

标签 ios streaming core-audio extaudiofileread

因此,我设置了一个多 channel 混音器和一个远程 I/O 单元来混合/播放我从音频文件中读取的多个 PCM 数据缓冲区。 对于游戏中的短音效,我使用 ExtAudioFileRead() 将整个文件加载到内存缓冲区。

对于我的背景音乐,假设我有一个 3 分钟的压缩音频文件。假设它被编码为 mp3 @ 128 kbps(44,100 Hz 立体声),每分钟大约 1 MB,或总共 3 MB。未压缩,在内存中,如果我没记错的话,我相信它大约是十倍。我可以使用与小文件完全相同的方法;我相信 ExtAudioFileRead() 负责解码,在可用时使用(单个)硬件解码器,但我宁愿不一次读取整个缓冲区,而是定期“流式传输”它从磁盘。

首先想到的是在(非“扩展的”)音频文件服务 API 的下方执行一步并使用 AudioFileReadPackets(),如下所示:

  1. 准备两个缓冲区 A 和 B,每个缓冲区都足够容纳(比方说)5 秒的音频。在播放期间,从一个缓冲区开始读取并在到达末尾时切换到另一个缓冲区(即,它们构成环形缓冲区的两半)。

  2. 将文件中的前 5 秒音频读入缓冲区 A。

  3. 将文件中接下来的 5 秒音频读入缓冲区 B。

  4. 开始播放(从缓冲区 A)。

  5. 播放头进入缓冲区 B 后,将接下来的 5 秒音频加载到缓冲区 A。

  6. 一旦播放头再次进入缓冲区 A,将接下来的 5 秒音频加载到缓冲区 B。

  7. 转到#5

这是正确的方法,还是有更好的方法?

最佳答案

我建议使用高级 AVAudioPlayer 类对音频文件进行简单的后台播放。看: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/Chapters/Reference.html#//apple_ref/doc/uid/TP40008067

如果您需要更细粒度的控制和更低的延迟,请查看 Apple 的 AUAudioFilePlayer。有关讨论,请参阅 AudioUnitProperties.h。这是一个音频单元,它抽象了从磁盘流式传输音频文件的复杂性。也就是说,设置和使用它仍然相当复杂,所以一定要先尝试 AVAudioPlayer。

关于ios - Core Audio 大型(压缩)文件播放和内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23825766/

相关文章:

objective-c - 如何获得当前音量

php - 需要一个脚本来传输最新的 MySQL 字段条目

linux - mp3 http 流 : recording and playing simultaneosly

objective-c - 如何使用 RemoteIO 核心音频最好地构建程序

ios - 在 SDK 谷歌地图中快速绘制多边形/形状

iis-7 - : video coded parameters, 网络服务器配置、视频播放器的视频流细节是什么?

ios - 在 64 位处理器上运行时出现 Core Audio 错误

ios - 翻转过渡 uinavigationcontroller push

iOS : Can I start my application with device restart using push notification?

iphone - UIImagePickerController 保存文件路径 iOS/iPhone