在iPhone上使用RemoteIO和AudioUnits播放MP3 ......可能吗?

时间:2009-12-07 03:22:34

标签: iphone audio core-audio

我想使用RemoteIO / AudioUnit播放mp3而不是未压缩的文件。 使用未压缩的文件显然使用了太多的磁盘空间(30MB而不是3MB用于mp3)。

这甚至可能吗?如果是这样,你能提供一点代码吗?

万分感谢。

2 个答案:

答案 0 :(得分:2)

你想要去哪个低级别?您可以使用AudioHardware API:

err = AudioDeviceAddIOProc(deviceID, ioProc, self);

并在您的ioProc中自己填充缓冲区,监听硬件更改,并处理实时线程和许多其他低级别的东西。

我假设您已经使用AudioConverter解码mp3数据,并知道如何做到这一点。

答案 1 :(得分:1)

是的,有可能。但它需要多个音频API使用和多个线程。

由于音频单元缓冲区回调线程的实时约束,您将在压缩音频单元回调之外将压缩文件转换为原始PCM样本。您可以使用扩展音频文件服务或AVAssetReader转换为音频单元回调之外的未压缩样本。但是,您无需一次解压缩整个文件。只要你在音频单元回调缓冲器消耗率之前保持足够的填充,就可能会有一小段时间的短无压缩缓冲区。这可以在一个单独的定时器驱动线程中完成,该线程监视缓冲区消耗,并相应地解压缩足够的音频,可能是环形缓冲区或循环FIFO。

您将最终得到的内容类似于重写音频队列API层,但具有更多可自定义性。