在内存中为AVAudioPlayer initWithData生成LPCM缓冲区

时间:2010-03-28 07:46:17

标签: iphone audio core-audio avaudioplayer

我想以编程方式生成声波并与AVAudioPlayer一起播放。我有代码将我的波形编码为线性PCM,44100Hz,单声道,每个样本8位。

我不清楚我需要在这个缓冲区周围包裹什么类型的信封,以便AVAudioPlayer将其识别为PCM。

3 个答案:

答案 0 :(得分:5)

PCM只是模拟音频信号的数字表示。不幸的是,它没有封装任何有关音频信道,比特深度或采样率的元数据 - 所有这些都是正确读取所述PCM数据所必需的。我假设AVAudioPlayer会接受包含在NSData对象中的PCM数据,只要您能够在AVAudioPlayer对象中手动设置这些变量即可。不幸的是,这些变量是只读的,因此即使文档说AVAudioPlayer可以处理Core Audio可以处理的任何内容,它也无法处理原始LPCM数据。

正如zoul所说,我认为最简单的方法就是抛出一个WAV标题,因为标题会告诉AVPlayer上述必要的变量。它是44个字节,很容易被模拟,并且很好地定义 - 我使用上面给出的definition来实现wav头编码和解码。此外,它只是预先添加到未修改的 LPCM数据中。

答案 1 :(得分:4)

也许添加WAV header会有所帮助吗?

答案 2 :(得分:0)

我发布了一个Swift 5示例(作为GitHub Gist),将音频浮动样本的缓冲区转换为内存中的WAV文件,以与AVAudioPlayer initWithData一起使用,这里:https://gist.github.com/hotpaw2/4eb1ca16c138178113816e78b14dde8b