AVAudioPlayer播放失败

在iOS开发中,音频播放失败的原因有很多,此文只介绍小编遇到的一种情况(会话类别异常),未列原因烦请问度娘或Google.

现在负责的app原本有音频播放功能,新版本需要接入第三方的语音评测(录音及播放已封装在第三方SDK中),问题出在评测过程中,在未播放录制音频前,原有的音频播放失败,例如在Controller A界面有一播放按钮Button_A1,播放a.mp3音频文件,还有一按钮Button_A2,实现长按录音,松手弹出评测结果界面View B,在B中有一按钮Button_B,播放录制的音频;在弹框B弹出后,点击Button_B之前,关闭弹框,Button_A1播放失败,但如果先点击Button_B,播放完毕,再点击Button_A1,则播放正常(原谅口才缺陷,看下图)

AVAudioPlayer播放失败_第1张图片
Snip20170324_11.png

由于录音及播放功能封装在SDK中,只能拿到播放结束的代理方法,不清楚在录音结束时调用了什么代码,so 尴尬。

解决办法:

修改音频会话类别

问题原因应该是在录音阶段,SDK设置音频会话类别为AVAudioSessionCategoryRecord,这会停止其他应用的声音(比如iPod)并让你的应用也不能初始化音频回放(比如AVAudioPlayer)。在这种模式下,你只能进行录音。使用这个类别,调用AVAudioPlayer的prepareToPlay会返回YES,但是调用play方法将返回NO。主UI界面会照常工作。这时,即使你的设备屏幕被用户锁定了,应用的录音仍会继续。而在播放完录制音频后需主动修改会话类别,所以播放音频前需要主动调用

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
简单介绍一下常见的几种会话类别:

AVAudioSessionCategoryAmbient
这个类别不会停止其他应用的声音,相反,它允许你的音频播放于其他应用的声音之上,比如iPod。你的应用的主UI县城会工作正常。调用AVAPlayer的prepareToPlay和play方法都将返回YES。当用户锁屏时,你的应用将停止所有正在回放的音频。仅当你的应用是唯一播放该音频文件的应用时,静音模式将停止你程序的音频回放。如果正当iPod播放一手歌时,你开始播放音频,将设备设为静音模式并不能停止你的音频回放

AVAudioSessionCategorySoloAmbient
这个类别非常像AVAudioSessionCategoryAmbient类别,除了会停止其他程序的音频回放,比如iPod程序。当设备被设置为静音模式,你的音频回放将会停止。

AVAudioSessionCategoryRecord
这会停止其他应用的声音(比如iPod)并让你的应用也不能初始化音频回放(比如AVAudioPlayer)。在这种模式下,你只能进行录音。使用这个类别,调用AVAudioPlayer的prepareToPlay会返回YES,但是调用play方法将返回NO。主UI界面会照常工作。这时,即使你的设备屏幕被用户锁定了,应用的录音仍会继续。

AVAudioSessionCategoryPlayback
这个类别会静止其他应用的音频回放(比如iPod应用的音频回放)。你可以使用AVAudioPlayer的prepareToPlay和play方法,在你的应用中播放声音。主UI界面会照常工作。这时,即使屏幕被锁定或者设备为静音模式,音频回放都会继续。

AVAudioSessionCategoryPlayAndRecord
这个类别允许你的应用中同时进行声音的播放和录制。当你的声音录制或播放开始后,其他应用的声音播放将会停止。主UI界面会照常工作。这时,即使屏幕被锁定或者设备为静音模式,音频回放和录制都会继续。

AVAudioSessionCategoryAudioProcessing
这个类别用于应用中进行音频处理的情形,而不是音频回放或录制。设置了这种模式,你在应用中就不能播放和录制任何声音。调用AVAPlayer的prepareToPlay和play方法都将返回NO。其他应用的音频回放,比如iPod,也会在此模式下停止。

你可能感兴趣的:(AVAudioPlayer播放失败)