AVAudioPlayer

       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 :停止播放行为

pausestop方法在应用程序外面看来实现的功能都是停止当前播放行为,下一时间我们调用play方法,通过pausestop方法停止音频会继续播放。这两者最主要的区别在底层处理上。调用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];

AVAudioPlayer_第1张图片

在 handleInterruption:方法中,首先通过检索AVAudioSessionInterruptionTypeKey的值确定中断类型,AVAudioSessionInterruptionType 这是用于表示中断开始或结束的枚举类型。

你可能感兴趣的:(AVAudioPlayer)