【发布时间】:2009-12-07 03:22:33
【问题描述】:
我想使用 RemoteIO / AudioUnit 播放 mp3 而不是未压缩的文件。 使用未压缩的文件显然会占用过多的磁盘空间(mp3 为 30MB,而 mp3 为 3MB)。
这甚至可能吗?如果是这样,你能提供一点代码启动吗?
谢谢一百万。
【问题讨论】:
标签: iphone audio core-audio
我想使用 RemoteIO / AudioUnit 播放 mp3 而不是未压缩的文件。 使用未压缩的文件显然会占用过多的磁盘空间(mp3 为 30MB,而 mp3 为 3MB)。
这甚至可能吗?如果是这样,你能提供一点代码启动吗?
谢谢一百万。
【问题讨论】:
标签: iphone audio core-audio
你想去多低级?您可以使用 AudioHardware API:
err = AudioDeviceAddIOProc(deviceID, ioProc, self);
然后在你的 ioProc 中自己填充缓冲区,监听硬件变化,处理实时线程和许多其他低级的东西。
我假设您已经在使用 AudioConverter 解码 mp3 数据并且知道如何做到这一点。
【讨论】:
ExtAudioFileOpenURL打开文件,然后可以使用ExtAudioFileGetProperty获取文件长度和数据格式等信息。然后使用ExtAudioFileSetProperty将输出格式设置为PCM数据,所以当你在循环中调用ExtAudioFileRead时,它会返回未压缩的数据。
是的,这是可能的。但它需要使用多个音频 API 和多个线程。
由于音频单元缓冲区回调线程的实时限制,您必须在音频单元回调之外将压缩文件转换为原始 PCM 样本。您可以使用扩展音频文件服务或 AVAssetReader 在音频单元回调之外进行未压缩样本的转换。但是,您不需要一次解压缩整个文件。只要您在音频单元回调缓冲区消耗率之前将其填充足够远,那么可能会使用不到几分之一秒的简短未压缩缓冲区。这可以在一个单独的计时器驱动线程中完成,该线程监控缓冲区消耗,并相应地解压缩足够的音频,可能会进入环形缓冲区或循环 FIFO。
您最终将得到的将类似于对音频队列 API 层的重写,但具有更多的可定制性。
【讨论】: