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

Posted

技术标签:

【中文标题】Core Audio 大(压缩)文件播放和内存占用【英文标题】:Core Audio Large (Compressed) File Playback and Memory Footprint 【发布时间】:2014-05-23 09:36:40 【问题描述】:

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

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

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

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

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

    将接下来 5 秒的音频从文件读取到缓冲区 B。

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

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

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

    转到#5

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

【问题讨论】:

【参考方案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。

【讨论】:

我确实需要更精细的控制和音频图表(除了播放文件之外,我还会做其他事情:效果、声音合成等),而且我已经习惯使用音频单元,所以我会检查AUAudioFilePlayer。谢谢! 好的,我已经等了几天,没有其他答案出现,所以我给你打勾。

以上是关于Core Audio 大(压缩)文件播放和内存占用的主要内容,如果未能解决你的问题,请参考以下文章

Core Audio - 多样本播放/录音

文件内存太大,怎么压缩变小

无法在 chrome、firexfox 浏览器中使用 html <audio> 播放压缩的 wav 文件

在 iOS 中使用 Core Audio 同时播放和录音

音视频 — AudioRecorder 和 AudioTrack

vue.js实现audio播放amr格式音频