在iPhone上使用RemoteIO和AudioUnits播放MP3。。。可能的

在iPhone上使用RemoteIO和AudioUnits播放MP3。。。可能的,iphone,audio,core-audio,Iphone,Audio,Core Audio,我想使用RemoteIO/AudioUnit播放mp3而不是未压缩的文件。 使用未压缩的文件显然占用了太多的磁盘空间(对于mp3来说是30MB对3MB) 这可能吗?如果是的话,你能提供一个小的代码启动吗 非常感谢。你想去多低级别?您可以使用AudioHardware API: err=AudioDeviceAddIOProc(设备ID、ioProc、self) 在ioProc中,自己填充缓冲区,监听硬件更改,处理实时线程和许多其他低级内容 我假设您已经使用音频转换器解码mp3数据,并且知道如何进

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

这可能吗?如果是的话,你能提供一个小的代码启动吗


非常感谢。

你想去多低级别?您可以使用AudioHardware API:

err=AudioDeviceAddIOProc(设备ID、ioProc、self)

在ioProc中,自己填充缓冲区,监听硬件更改,处理实时线程和许多其他低级内容


我假设您已经使用音频转换器解码mp3数据,并且知道如何进行解码。

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

由于音频单元缓冲区回调线程的实时限制,您必须在音频单元回调之外将压缩文件转换为原始PCM样本。您可以使用扩展音频文件服务或Avassetrader在音频单元回调之外进行到未压缩样本的转换。但是,您不需要一次解压缩整个文件。只要在音频单元回调缓冲区消耗率之前一直填充足够多的未压缩缓冲区,一秒几分之一的短缓冲区就可以了。这可以在一个单独的计时器驱动线程中完成,该线程监视缓冲区消耗,并相应地解压缩足够的音频,可能会将其解压缩到环形缓冲区或循环FIFO中


最终的结果与重写音频队列API层类似,但更具可定制性。

我将研究AudioConverter,它可能就是我想要的。我的问题不是使用音频单元本身,因为我已经可以用wav做一些低级的东西了,但是我想用MP3。谢谢:)对于转换MP3,我建议使用扩展音频文件服务。使用
ExtAudioFileOpenURL
打开文件,然后可以使用
ExtAudioFileGetProperty
获取文件长度和数据格式以及其他信息。然后使用
ExtAudioFileSetProperty
将输出格式设置为PCM数据,以便在循环中调用
ExtAudioFileRead
时,它返回未压缩的数据。