Sergio Chan

Full Stack, Born hacker, Professional Manager

Crazy fan of Hackathons all around the world.
Founded Hackathon team hACKbUSTER.


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 的时候就已经被释放掉了。