我想使用RemoteIO / AudioUnit播放mp3而不是未压缩的文件。 使用未压缩的文件显然使用了太多的磁盘空间(30MB而不是3MB用于mp3)。
这甚至可能吗?如果是这样,你能提供一点代码吗?
万分感谢。
答案 0 :(得分:2)
你想要去哪个低级别?您可以使用AudioHardware API:
err = AudioDeviceAddIOProc(deviceID, ioProc, self);
并在您的ioProc中自己填充缓冲区,监听硬件更改,并处理实时线程和许多其他低级别的东西。
我假设您已经使用AudioConverter解码mp3数据,并知道如何做到这一点。
答案 1 :(得分:1)
是的,有可能。但它需要多个音频API使用和多个线程。
由于音频单元缓冲区回调线程的实时约束,您将在压缩音频单元回调之外将压缩文件转换为原始PCM样本。您可以使用扩展音频文件服务或AVAssetReader转换为音频单元回调之外的未压缩样本。但是,您无需一次解压缩整个文件。只要你在音频单元回调缓冲器消耗率之前保持足够的填充,就可能会有一小段时间的短无压缩缓冲区。这可以在一个单独的定时器驱动线程中完成,该线程监视缓冲区消耗,并相应地解压缩足够的音频,可能是环形缓冲区或循环FIFO。
您将最终得到的内容类似于重写音频队列API层,但具有更多可自定义性。