AVAudioPlayer提供了一个简单的从文本或内存中播放音频的方法,它在Mac和iOS 11系统中经常被作为实现音频播放的最佳选择。
AVAudioPlayer构建于Core Audio中的C-based Audio Queue Services的最顶层。所以他可以提供所有你在Audio Queue Services中所能找到的核心功能,比如播放、循环、甚至音频计量,但是使用的是非常友好的OC接口。除非你需要从网络流中播放音频、需要访问原始音频样本或者需要非常低的时延,否则AVAudioPlayer都能胜任。
1.配置音频会话
音频会话的周期是可以修改的 但通常我们只对其配置一次,就是在应用程序启动时。配置回话的最佳位置就在此方法内
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error;
if (![session setCategory:AVAudioSessionCategoryPlayback error:&error]) {
NSLog(@"category error:%@",[error localizedDescription]);
}
if (![session setActive:YES error:&error]) {
NSLog(@"activation error:%@",[error localizedDescription]);
}
AVAudioSessionCategoryAmbient:使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音。
AVAudioSessionCategorySoloAmbient:使用这个category的应用会随着静音键和屏幕关闭而静音。不可以与其他声音混合播放,会中断其他声音。
AVAudioSessionCategoryPlayback:使用这个category的应用时,当手机设置为静音或进入后台时会继续播放,如果让使声音在后台继续播放时,必须在plist文件里面添加UIBackgroundModes属性。默认情况下,使用这一类别意味着你的应用程序的音频是不可混合激活的,你的会话将中断任何其他非混合的音频会话。
AVAudioSessionCategoryRecord:用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。该Category只提供单纯录音功能。如果让使声音在后台继续播放时,必须在plist文件里面添加UIBackgroundModes属性。
AVAudioSessionCategoryPlayAndRecord:允许播放或录制音频,两者不可同时进行,除此之外同AVAudioSessionCategoryPlayback类似。支持AirPlay 。但是如果设置AVAudioSessionModeVoiceChat属性, AirPlay是不可用的。
AVAudioSessionCategoryMultiRoute:支持音频播放和录制。允许多条音频流的同步输入和输出。比如:USB 和耳麦同时音频输出。
2.创建AVAudioPlayer
NSURL *url = [[NSBundle mainBundle] URLForResource:@"rock" withExtension:@"mp3"];
NSError *error = nil;
self.player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];
if (error == nil) {
[self.player prepareToPlay];
}
[self.player play];
- (BOOL)prepareToPlay : 会取得需要的音频文件并预加载Audio Queue的缓存区,降低调用play方法和听到声音输出之间的延时,在使用play方法时如果没有做好准备会自动调用该方法
注意事项:AVAudioPlayer一定要设置成全局变量,局部变量会被释放
- (BOOL)play : 立即播放音频
- (void)pause : 播放暂停
- (void)stop :停止播放行为
pause和stop方法在应用程序外面看来实现的功能都是停止当前播放行为,下一时间我们调用play方法,通过pause和stop方法停止音频会继续播放。这两者最主要的区别在底层处理上。调用stop方法会撤销prepareToPlay时所做的设置,而调用pause方法则不会。
@property float volume : 修改播放器的音量,播放器的音量独立于系统的音量,我们可以通过对播放器音量的处理实现很多有趣的效果,比如声音建银效果。(0.0-1.0)
@property float pan : 允许使用立体声播放声音:播放器的pan只有一个浮点表示,范围从-1.0(极左)到1.0(极右)。默认值为0.0(居中)
@property float rate :调整播放率,允许用户在不改变声调的情况下调整播放率(0.5-2.0)如果正记录一首复杂的音乐或语音,放慢速度会有很大的帮助;当我们想快速浏览一份政府常规会议内容时,加速播放就很有帮助。
@property NSInteger numberOfLoops :
- (BOOL)playAtTime:(NSTimeInterval)time :指定时间点,异步播放声音。
延迟播放:
NSTimeInterval playbackDelay = 3.0; // must be ≥ 0
[myAudioPlayer playAtTime: myAudioPlayer.deviceCurrentTime + playbackDelay];
使用这个方法可以同步播放两个及以上指定的音频,建议:
NSTimeInterval shortStartDelay = 0.01; // seconds
NSTimeInterval now = player.deviceCurrentTime;
[player playAtTime: now + shortStartDelay];
[secondPlayer playAtTime: now + shortStartDelay];
3.处理中断事件
我们要确保应用程序可以正确的处理中断事件。中断事件在 iOS 设备中经常出现,在使用设备的过程中经常会有诸如电话呼入、闹钟响起及弹出 FaceTime 请求的情况。虽然 iOS 本身可以很好地处理这些事件,不过我们还是确保我们自己针对这些情况地处理足够完美。
添加终端通知:
NSNotificationCenter *nsnc = [NSNotificationCenter defaultCenter];
[nsnc addObserver:self selector:@selector(handleInterruption:) name:AVAudioSessionInterruptionNotification object:nil];
在 handleInterruption:方法中,首先通过检索AVAudioSessionInterruptionTypeKey的值确定中断类型,AVAudioSessionInterruptionType 这是用于表示中断开始或结束的枚举类型。