因此,我设置了一个多通道混音器和一个远程 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
这是正确的方法,还是有更好的方法?