AVAudioPlayer的几个细节
昨天在做 iOS 上的声波传输的时候,倒是遇到了几个和 AVAudioPlayer 有关的有趣问题,这种问题一般情况下我们都注意不到,只要踩过了才知道。
关于 PCM Data
AVAudioPlayer
有一个初始化方法 initWithData:error:
,这个方法的 API 说明是
/ all data must be in the form of an audio file understood by CoreAudio /
在苹果的文档里,我们看到 AVAudioPlayer并不能支持 Stream 播放,它支持的文件格式有下面这些:
Format name | Format filename extensions |
---|---|
AIFF | .aif , .aiff |
CAF | .caf |
MPEG-1, layer 3 | .mp3 |
MPEG-2 or MPEG-4 ADTS | .aac |
MPEG-4 | .m4a , .mp4 |
WAV | .wav |
Stream 类型的音乐流只能被 AudioQueue 或者 AudioUnit 支持。因此要用 AVAudioPlayer
来播放 PCM 数据的话,注意要为这个 PCM 包加上 WAV 的 HEADER,然后将完整的 NSData 传给它。
关于 Play
AVAudioPlayer
还有个有趣的现象,我暂时没有找到官方文档的证据,那就是它的 play
不会对自身有一个引用来保持自己是活着的。只要它的父类之上有一个对象被释放了,那它也就被一起释放掉了。因此无论你是在第一层直接声明 self.audioPlayer play 还是 self.A.audioPlayer.play ,它的最上层父类必须有一个和 VC 相关或者全局相关的强引用,否则就会在 play 的时候就已经被释放掉了。