我想以编程方式生成声波并使用 AVAudioPlayer 播放它。我有代码将我的波形编码为线性 PCM、44100Hz、单声道、每个样本 8 位。
我不清楚我需要在这个缓冲区周围包裹什么样的信封,以便 AVAudioPlayer 将其识别为 PCM。
我想以编程方式生成声波并使用 AVAudioPlayer 播放它。我有代码将我的波形编码为线性 PCM、44100Hz、单声道、每个样本 8 位。
我不清楚我需要在这个缓冲区周围包裹什么样的信封,以便 AVAudioPlayer 将其识别为 PCM。
PCM 只是模拟音频信号的数字表示。不幸的是,它没有封装任何关于音频的元数据——通道、位深度或采样率——所有这些都是正确读取所述 PCM 数据所必需的。只要您能够在 AVAudioPlayer 对象中手动设置这些变量,我会假设 AVAudioPlayer 会接受包装在 NSData 对象中的这个 PCM 数据。不幸的是,这些变量是只读的,因此即使文档说 AVAudioPlayer 可以处理 Core Audio 可以处理的任何内容,它也无法处理原始 LPCM 数据。
正如 zoul 所说,我想最简单的方法是加入 WAV 标头,因为标头会通知 AVPlayer 上述必要变量。它有 44 个字节,很容易模拟,并且定义得很好——我使用上面给出的相同定义来实现 wav 标头编码和解码。此外,它只是添加到您未修改的LPCM 数据之前。
也许添加WAV 标头会有所帮助?
我在这里发布了一个 Swift 5 示例(作为 GitHub Gist),将音频浮点样本的缓冲区转换为内存中的 WAV 文件以与 AVAudioPlayer initWithData 一起使用,这里:https ://gist.github.com/hotpaw2/4eb1ca16c138178113816e78b14dde8b