美文网首页
AVAudioPlayer

AVAudioPlayer

作者: 沫粢泪虞 | 来源:发表于2018-03-29 14:58 被阅读84次

           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];

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

    相关文章

      网友评论

          本文标题:AVAudioPlayer

          本文链接:https://www.haomeiwen.com/subject/zxntcftx.html