【问题标题】:Playback MP3 using RemoteIO and AudioUnits on iPhone... possible?在 iPhone 上使用 RemoteIO 和 AudioUnits 播放 MP3……可能吗?
【发布时间】:2009-12-07 03:22:33
【问题描述】:

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

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

谢谢一百万。

【问题讨论】:

    标签: iphone audio core-audio


    【解决方案1】:

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

    err = AudioDeviceAddIOProc(deviceID, ioProc, self);

    然后在你的 ioProc 中自己填充缓冲区,监听硬件变化,处理实时线程和许多其他低级的东西。

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

    【讨论】:

    • 我会研究 AudioConverter,它可能是我所追求的。我的问题不在于使用 AudioUnits 本身,因为我已经可以使用 wav 完成低级的工作,但我想使用 MP3。谢谢你:)
    • 为了转换 MP3,我建议使用扩展音频文件服务。使用ExtAudioFileOpenURL打开文件,然后可以使用ExtAudioFileGetProperty获取文件长度和数据格式等信息。然后使用ExtAudioFileSetProperty将输出格式设置为PCM数据,所以当你在循环中调用ExtAudioFileRead时,它会返回未压缩的数据。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多