核心音频大(压缩)文件播放和内存占用

时间:2014-05-23 09:36:40

标签: ios streaming core-audio extaudiofileread

所以,我已经设置了一个多声道混音器和一个远程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

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

1 个答案:

答案 0 :(得分:1)

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

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