6

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

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

4

3 回答 3

5

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

正如 zoul 所说,我想最简单的方法是加入 WAV 标头,因为标头会通知 AVPlayer 上述必要变量。它有 44 个字节,很容易模拟,并且定义得很好——我使用上面给出的相同定义来实现 wav 标头编码和解码。此外,它只是添加到您未修改的LPCM 数据之前。

于 2010-03-31T20:39:03.190 回答
4

也许添加WAV 标头会有所帮助?

于 2010-03-28T08:52:40.337 回答
0

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

于 2019-05-16T21:06:32.477 回答