在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数据并知道如何做到这一点。
我会调查AudioConverter,它可能是我以后。我的问题不是关于使用AudioUnit本身,因为我已经可以使用wav处理低级别的东西了,但我想使用MP3。谢谢:) – 2010-01-01 17:22:14
对于转换MP3,我建议使用扩展音频文件服务。使用'ExtAudioFileOpenURL'打开文件,然后使用'ExtAudioFileGetProperty'获取文件长度和数据格式以及其他信息。然后使用'ExtAudioFileSetProperty'将输出格式设置为PCM数据,因此当您在循环中调用'ExtAudioFileRead'时,它会返回未压缩的数据。 – lucius 2010-01-01 20:13:35