流媒体开发(二)后台音频播放

简介

我们发现现在我们所做的音频播放只支持前台播放,当我们退出后台时,音频播放就会停止。但是通常我们看到的播放器即使退出到后台也是可以播放的,我们可以通过音频会话来实现音频的后台播放。

1. 音频会话

在iOS中每个应用都有一个音频会话,这个会话就通过AVAudioSession来表示。AVAudioSession同样存在于AVFoundation框架中,它是单例模式设计,通过sharedInstance进行访问。在使用Apple设备时大家会发现有些应用只要打开其他音频播放就会终止,而有些应用却可以和其他应用同时播放,在多种音频环境中如何去控制播放的方式就是通过音频会话来完成的。

在获得AVAudioSession类的实例后,你就能通过调用音频会话对象的 setCategory:error: 实例方法,来从IOS应用可用的音频会话的不同类别中作出选择。但是注意一下,设置完音频会话类型之后需要调用setActive:error:方法将会话激活才能起作用。类似的,如果一个应用已经在播放音频,打开我们的应用之后设置了在后台播放的会话类型,此时其他应用的音频会停止而播放我们的音频,如果希望我们的程序音频播放完之后(关闭或退出到后台之后)能够继续播放其他应用的音频的话则可以调用setActive:error:方法关闭会话。

下面是音频会话的几种会话模式:

会话类型 说明 是否要求输入 是否要求输出 是否遵从静音键
AVAudioSessionCategoryAmbient 混音播放,可以与其他音频应用同时播放
AVAudioSessionCategorySoloAmbient 独占播放
AVAudioSessionCategoryPlayback 后台播放,也是独占的
AVAudioSessionCategoryRecord 录音模式,用于录音时使用
AVAudioSessionCategoryPlayAndRecord 播放和录音,此时可以录音也可以播放
AVAudioSessionCategoryAudioProcessing 硬件解码音频,此时不能播放和录制
AVAudioSessionCategoryMultiRoute}多种输入输出,例如可以耳机、USB设备同时播放

注意:

是否遵循静音键表示在播放过程中如果用户通过硬件设置为静音是否能关闭声音。

下面是不变通音频会话模式的使用场景及相关注意事项:

  • AVAudioSessionCategoryAmbient:后台播放类型,会和其它音乐混合的音频类型。 这个类别用于音频比较次要的应用,应用的音频会和其他应用的音频实现混音,关闭屏幕或者静音开关打开时音频将静音.
  • AVAudioSessionCategorySoloAmbient:后台播放类型,其它音乐会停止播放, 是默认类别。这个类别非常像AVAudioSessionCategoryAmbient 类别,除了会停止其他程序的音频回放。
  • AVAudioSessionCategoryPlayback:这个类别会静止其他应用的音频回放。你可以使用AVAudioPlaye的prepareToPlay和play方法,在你的应用中播放声音。主UI界面会照常工作。这时,即使屏幕被锁定或者设备为静音模式,音频回放都会继续。
  • AVAudioSessionCategoryRecord:录音时使用。 这会停止其他应用的声音并让你的应用也不能初始化音频回放(比如AVAudioPlaye)。在这种模式下,你只能进行录音。使用这个类别,调用AVAudioPlaye 的 prepareToPlay 会返回 true,但是调用 play 方法将返回 false。主UI界面会照常工作。这时,即使你的设备屏幕被用户锁定了,应用的录音仍会继续。

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

  • AVAudioSessionCategoryAudioProcessing:这个类别用于音频处理,比如编码解码时/不播放音频/未录音时使用。设置了这种模式,你在应用中就不能播放和录制任何声音。调用AVAudioPlaye的prepareToPlay 和play方法都将返回false。其他应用的音频也会在此模式下停止。
  • AVAudioSessionCategoryMultiRoute:这个类别可以实现同时可以有多种输出,例如:usb和耳机同时输出,但并非所有输入输出方式均支持. 输入方式仅包括:
    AVAudioSessionPortUSBAudio
    AVAudioSessionPortHeadsetMic
    AVAudioSessionPortBuiltInMic
    输出仅包括:
    AVAudioSessionPortUSBAudio
    AVAudioSessionPortLineOut
    AVAudioSessionPortHeadphones
    AVAudioSessionPortHDMI
    AVAudioSessionPortBuiltInSpeaker

根据前面对音频会话的理解,我们就可以使用音频会话来实现音频文件的后台播放了,如果要支持后台播放需要做下面几件事情:

  1. 设置后台运行模式:在plist文件中添加Required background modes,并且设置item 0=App plays audio or streams audio/video using AirPlay(其实可以直接通过Xcode在Project Targets-Capabilities-Background Modes中设置)。如果应用程序要允许运行到后台必须设置,正常情况下应用如果进入后台会被挂起,通过该设置可以上应用程序继续在后台运行。

  2. 设置AVAudioSession的类型为AVAudioSessionCategoryPlayback并且调用setActive:error:方法启动会话。

  3. 为了能够让应用退到后台之后支持耳机控制,建议添加远程控制事件(这一步不是后台播放必须的)

    前两步是后台播放所必须设置的,第三步主要用于接收远程事件,方便我们在后台对音频播放的操作。如果这一步不设置虽让也能够在后台播放,但是无法获得音频控制权(如果在使用当前应用之前使用其他播放器播放音乐的话,此时如果按耳机播放键或者控制中心的播放按钮则会播放前一个应用的音频),并且不能使用耳机进行音频控制。

示例代码

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interfaceViewController ()
{
    AVAudioPlayer *_avAudioPlayer;
}
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    /*通过音频会话实现后台播放
     1. 在info.plist文件中添加Required background modes,并且设置item 0=App plays audio or streams audio/video using AirPlay
     2. 设置AVAudioSession的类型为AVAudioSessionCategoryPlay
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值