zoukankan      html  css  js  c++  java
  • iOS- 关于AVAudioSession的使用——后台播放音乐

    AVAudioSession是一个单例,无需实例化即可直接使用。AVAudioSession在各种音频环境中起着非常重要的作用
    •针对不同的音频应用场景,需要设置不同的音频会话分类
     

    1.1AVAudioSession的类别  

    •AVAudioSessionCategoryAmbient
    –混音播放,例如雨声、汽车引擎等,可与其他音乐一起播放
    •AVAudioSessionCategorySoloAmbient
    –后台播放,其他音乐将被停止
    •AVAudioSessionCategoryPlayback
    –独占音乐播放
    •AVAudioSessionCategoryRecord
    –录制音频
    •AVAudioSessionCategoryPlayAndRecord
    –播放和录制音频
    •AVAudioSessionCategoryAudioProcessing
    –使用硬件解码器处理音频,该音频会话使用期间,不能播放或录音
     
    图解:

    类别

    输入

    输出

    与iPOD混合

    遵从静音

     

    AVAudioSessionCategoryAmbient

    No

    Yes

    Yes

    Yes

    AVAudioSessionCategorySoloAmbient

    No

    Yes

    No

    Yes

    AVAudioSessionCategoryPlayback

    No

    Yes

    No

    No

    AVAudioSessionCategoryRecord

    Yes

    No

    No

    No

    AVAudioSessionCategoryPlayAndRecord

    Yes

    Yes

    No

    No

    2.后台播放音乐  

    2.1.开启所需要的后台模式  

     

    选中Targets-->Capabilities-->BackgroundModes-->ON,
    并勾选Audio and AirPlay选项,如下图

    2.2.在Appdelegate.m的applicationWillResignActive:方法中激活后台播放,代码如下

     

    在Appdelegate.m中定义全局变量
    UIBackgroundTaskIdentifier _bgTaskId;
    -(void)applicationWillResignActive:(UIApplication )application
    {
        //开启后台处理多媒体事件
        [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
        AVAudioSession session=[AVAudioSession sharedInstance];
        [session setActive:YES error:nil];
        //后台播放
        [session setCategory:AVAudioSessionCategoryPlayback error:nil];
        //这样做,可以在按home键进入后台后 ,播放一段时间,几分钟吧。但是不能持续播放网络歌曲,若需要持续播放网络歌曲,还需要申请后台任务id,具体做法是:
    _bgTaskId=[AppDelegate backgroundPlayerID:_bgTaskId];
        //其中的_bgTaskId是后台任务UIBackgroundTaskIdentifier _bgTaskId;在appdelegate.m中定义的全局变量
    }

    2.3.实现一下backgroundPlayerID这个方法  

    +(UIBackgroundTaskIdentifier)backgroundPlayerID:(UIBackgroundTaskIdentifier)backTaskId
    {
        //设置并激活音频会话类别
        AVAudioSession *session=[AVAudioSession sharedInstance];
        [session setCategory:AVAudioSessionCategoryPlayback error:nil];
        [session setActive:YES error:nil];
        //允许应用程序接收远程控制
        [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
        //设置后台任务ID
        UIBackgroundTaskIdentifier newTaskId=UIBackgroundTaskInvalid;
        newTaskId=[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
        if(newTaskId!=UIBackgroundTaskInvalid&&backTaskId!=UIBackgroundTaskInvalid)
        {
            [[UIApplication sharedApplication] endBackgroundTask:backTaskId];
        }
        return newTaskId;
    }

    2.4.处理中断事件,如电话,微信语音等  原理是,在音乐播放被中断时,暂停播放,在中断完成后,开始播放。具体做法是: 

    -->在通知中心注册一个事件中断的通知:
    //处理中断事件的通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleInterreption:) name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]];
    -->实现接收到中断通知时的方法
    //处理中断事件
    -(void)handleInterreption:(NSNotification *)sender
    {
        if(_played)
        {
          [self.playView.player pause];
            _played=NO;
        }
        else
        {
            [self.playView.player play];
            _played=YES;
        }
    }
  • 相关阅读:
    Selenium 2自动化测试实战
    Python学习笔记整理(python 3)
    Python编程中出现ImportError: bad magic number in 'numpy': b'x03xf3 '
    收集的一些表单常用的正则表达式。
    转载的一篇博客,感觉不错,自我感觉很到位,来自 http://www.cnblogs.com/laizhihui/p/5810965.html
    闲来无写的,就是中间有一条小细线,求大神指点。
    自己总结的有关PHP一些基本知识和一些常见的js问题
    不经意间看到的东西,感觉不错(转载)。
    无束缚版贪吃蛇(就问你爽不爽)
    小图局部放大效果(图片的话就自己找一个吧,记得是一张图片用两次,不是两张图片,而且你的图片不一定与我一样,需改一下放大的尺寸)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/9567364.html
Copyright © 2011-2022 走看看