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

问题描述:

我想使用RemoteIO/AudioUnit播放一个mp3而不是一个未压缩的文件。 使用未压缩的文件显然使用了太多的磁盘空间(30MB与3MB的mp3)。在iPhone上使用RemoteIO和AudioUnits播放MP3 ...可能吗?

这甚至可能吗?如果是这样,你能提供一个小小的代码headstart吗?

非常感谢。

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

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

你最终会如何重写Audio Queue API层,但具有更多的可定制性。

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

err = AudioDeviceAddIOProc(deviceID, ioProc, self);

,并在您ioProc自己填写的缓冲区,听听硬件改动,并处理实时线程和很多其他低层次的东西。

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

+0

我会调查AudioConverter,它可能是我以后。我的问题不是关于使用AudioUnit本身,因为我已经可以使用wav处理低级别的东西了,但我想使用MP3。谢谢:) – 2010-01-01 17:22:14

+3

对于转换MP3,我建议使用扩展音频文件服务。使用'ExtAudioFileOpenURL'打开文件,然后使用'ExtAudioFileGetProperty'获取文件长度和数据格式以及其他信息。然后使用'ExtAudioFileSetProperty'将输出格式设置为PCM数据,因此当您在循环中调用'ExtAudioFileRead'时,它会返回未压缩的数据。 – lucius 2010-01-01 20:13:35