如何从 iOS 上的 AudioQueue 服务获取样本

Posted

技术标签:

【中文标题】如何从 iOS 上的 AudioQueue 服务获取样本【英文标题】:How to get samples from AudioQueue Services on iOS 【发布时间】:2012-12-21 14:35:32 【问题描述】:

我正在尝试从 AudioQueue 获取样本以在 iPhone 上显示音乐频谱(如 iTunes 中)。

我读过很多帖子,但几乎所有的帖子都询问在录制而不是播放时获取样本:(

我正在使用 AudioQueue 服务来传输音频。请帮助理解以下几点: 1/ 我在哪里可以访问样本(PCM,非 mp3(我使用的是 mp3 流) 2/ 我应该在自己的缓冲区中收集样本以应用 fft 吗? 3/是否有可能在没有 fft 转换的情况下获得频率? 4/ 如何将缓冲区中的 fft shift 与当前播放的样本同步?

谢谢,

更新:

AudioQueueProcessingTapNew

对于 ios6+,这对我来说很好。但是 iOS5 呢?

【问题讨论】:

【参考方案1】:

对于播放音频,我们的想法是先获取样本,然后再将它们提供给音频队列回调。您可能需要事先将任何压缩音频文件格式转换为原始 PCM 样本。这可以使用 AVFoundation 转换器或文件阅读器服务之一来完成。

然后,您可以从用于馈送音频队列回调缓冲区的同一源复制数据帧,并应用您的 FFT 或其他 DSP 以对其进行可视化。

您可以使用 FFT 或一组带通滤波器来获取频率信息,但 FFT 在这方面非常有效。

同步需要通过反复试验来完成,因为 Apple 没有指定确切的音频和视图图形显示延迟,这在 iOS 设备和操作系统版本之间可能会有所不同。但是较短的音频队列缓冲区或使用 RemoteIO 音频单元可以让您更好地控制音频延迟,而 OpenGL ES 可以让您更好地控制图形延迟。

【讨论】:

感谢您的回答。但我仍然不明白如何将“mp3”数据解码为“RAW”数据。还是我应该使用外部库?谢谢 AVAssetReader 和 AVAssetWriter 内置于 iOS,无需外接。

以上是关于如何从 iOS 上的 AudioQueue 服务获取样本的主要内容,如果未能解决你的问题,请参考以下文章

iPhone dev - AudioQueue 服务在后台录制

ios音频:使用audioqueue改变播放进度

ios AudioQueue 流式传输多首歌曲

AudioQueue 如何从 CallBack 读取缓冲区

如何在 iOS 中使用原始数据播放音频?

如何从流数据中实现 AudioQueue