我只是想帮助其他遇到同样问题并花费大量时间进行搜索的人。为了节省大家的时间,我把我的答案贴出来。我不喜欢这里有人把这当作秘密......
在搜索了有关的文章后扩展音频服务, 音频队列 and 航空基金会.
我意识到我应该使用 AVFoundation,原因很简单,它是最新的捆绑包,它是 Objective C 但不是 cpp 风格。
所以实现的步骤并不复杂:
- Create
AVAsset
从音频文件
- Create
avassetreader
来自avasset
- Create
avassettrack
from avasset
- Create
avassetreadertrackoutput
from avassettrack
- Add the
avassetreadertrackoutput
到上一个avassetreader
开始读出音频数据
来自avassettrack输出你可以复制下一个样本缓冲区一项一项(这是一个循环,将所有数据读出)。
Each 复制下一个样本缓冲区给你一个CMSampleBufferRef可以用来得到音频缓冲区列表 by CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer. 音频缓冲区列表是数组音频缓冲区. 音频缓冲区是存储在其中的一堆音频数据mData part.
您可以在外部音频服务以及。但我认为以上航空基金会方法更容易。
那么下一个问题是,如何处理mData?请注意,当您获得avassetreadertrackoutput,可以指定它的输出格式,所以我们指定输出为lpcm.
然后mData你最终得到的实际上是一个浮点格式的幅度值。
容易吧?尽管我花了很多时间从各处整理这些内容。
分享两个有用的资源:
阅读本文以了解基本术语和概念:https://www.mikeash.com/pyblog/friday-qa-2012-10-12-obtaining-and-interpreting-audio-data.html
示例代码:https://github.com/iluvcapra/JHWaveform您可以直接从此示例中复制上述大部分代码并将其用于您自己的目的。