iOS AvPlayer AvAudioPlayer音频的后台播放问题

王桂敏

iOS AvPlayer AvAudioPlayer音频的后台播放问题

iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了。如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,AvPlayer播放的话,要实现完美的后台音频播放,依据app的功能需要,可能需要实现几个关键的功能。

首先,播放音频之前先要设置AVAudioSession模式,通常只用来播放的App可以设为AVAudioSessionCategoryPlayback即可。模式意义及其他模式请参考文档。

  1. AVAudioSession *session = [AVAudioSession sharedInstance];
  2. [session setCategory:AVAudioSessionCategoryPlayback error:nil];
  3. [session setActive:YES error:nil];

1。通知OS该app支持background audio。缺省情况下,当按下home键时,当前正在运行的程序被suspend,状态从active变成in-active,也就是说如果正在播放音频,按下HOME后就会停止。这里需要让app在按在HOME后,转到后台运行而非被suspend,解决办法是在程序的-info.plist中增加required background modes这个key项,并选择App plays audio这个value项。

2。现在按下HOME键后,程序退到后台,但是声音仍在播放。但是如果要实现播放列表的依次播放、循环播放,即放完一首后自动切换到下一首,问题来了,当App在后台放完一首后,就会停下来。原因是在后台运行时,一旦声音停下来,程序也随之suspend,因此在切换文件加载的间隙,程序就会被suspend。曾经有山寨的解决办法是专门起一个player的实例连续不停的放同一无声音片断,阻止程序被suspend。这里提供的方法是通过申请后台taskID达到后台切换播放文件的功能。

即声明后台task id,并通过beginBackgroundTaskWithExpirationHandler将App设为后台Task,达到持续后台运行的目的。我们知道一般情况下,按HOME将程序送到后台,可以有5或10秒时间可以进行一些收尾工作,具体时间[[UIApplication sharedApplication] backgroundTimeRemaining]返回值。超时后app会被suspend,现在要做的就是用[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]开始后台任务,可以将后台运行超时时间长时间的延长,具体延长多少时间还是见返回值,总之对于放段时间音乐应该够了。另一个问题是每个开始的后台任务,都必须用endBackgroundTask来结束。 因此,在每次开始播放后启动新的后台任务,同时结束上一个后台任务:

首先,要在viewdidload中

  1. [UIApplication sharedApplication] beginReceivingRemoteControlEvents];

否则,无法切换到下一首,接下来

  1. UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
  2. [avPlayer play];
  3. newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
  4. if (newTaskId != UIBackgroundTaskInvalid && oldTaskId != UIBackgroundTaskInvalid) {
  5. [[UIApplication sharedApplication] endBackgroundTask: oldTaskId];}
  6. oldTaskId = newTaskId;

当然,还有更方便的办法就是在resignActive时beginBackgroundTaskWithExpirationHandler:并在BecomeActive中endBackgroundTask:

3。我们知道,ipod播放程序在后台时,双击HOME键,会有个控制界面,可以对它进行播放控制。

如果您想让您的app可以像ipod一样在后台也可以方便的通过双击HOME键来控制,就要用到远程控制事件了。

首先在viewdidload等初始化的地方声明App接收远程控制事件,并在相应地方结束声明

  1. - (void) viewWillAppear:(BOOL)animated
  2. {
  3. [super viewWillAppear:animated];
  4. [UIApplication sharedApplication] beginReceivingRemoteControlEvents];
  5. [self becomeFirstResponder];
  6. }
  7. - (void) viewWillDisappear:(BOOL)animated
  8. {
  9. [super viewWillDisappear:animated];
  10. [UIApplication sharedApplication] endReceivingRemoteControlEvents];
  11. [self resignFirstResponder];
  12. }

定义

  1. - (BOOL)canBecomeFirstResponder
  2. {
  3. return YES;
  4. }

最后定义 remoteControlReceivedWithEvent,处理具体的播放、暂停、前进、后退等具体事件

  1. - (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {
  2. if (receivedEvent.type == UIEventTypeRemoteControl) {
  3. switch (receivedEvent.subtype) {
  4. case UIEventSubtypeRemoteControlTogglePlayPause:
  5. [self playButtonPressed:playButton];
  6. [self testing];
  7. break;
  8. case UIEventSubtypeRemoteControlPreviousTrack:
  9. [self rewButtonReleased:(UIButton *)rewButton];
  10. break;
  11. case UIEventSubtypeRemoteControlNextTrack:
  12. [self ffwButtonReleased:(UIButton *)ffwButton];
  13. break;
  14. default:
  15. break;
  16. }
  17. }
  18. }

4. 至此,您有播放App已经相当完美了,还有最后一个问题,那就是当用户使用耳机时,问题又来了。系统默认当插入耳机时,正在播放的声音不中断,直接切换到耳机播放,而当拔出耳机时,播放停止。如果这种行为满足您的要求,那OK,否则您就需要进一步研究耳机检测和声音路由切换的问题。

时间: 2024-08-02 10:57:00

iOS AvPlayer AvAudioPlayer音频的后台播放问题的相关文章

iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断)

iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断) 2013-12-11 21:13 1416人阅读 评论(0) 收藏 举报  分类: cocoa SDK(139)  目录(?)[+] 在没有网络的情况下,音频的后台播放比较简单,google一下可以搜到很多资料,但是如果每次歌曲的请求都是通过网络,就不成了,有时可以也扛不了几首,这里总结下实现方法,可以实现像电台一样的功能,后台播放,网络请求歌曲,Remote控制,锁屏有封面,电话和听歌打断处理等.   初始化A

iOS音频的后台播放总结

在没有网络的情况下,音频的后台播放比较简单,google一下可以搜到很多资料,但是如果每次歌曲的请求都是通过网络,就不成了,有时可以也扛不了几首,这里总结下实现方法,可以实现像电台一样的功能,后台播放,网络请求歌曲,Remote控制,锁屏有封面,电话和听歌打断处理等.   初始化AudioSession和基本配置 音频播放器采用的AVPlayer ,自己进行了功能封装,暂且不谈,在程序启动的时候需要配置AudioSession,AudioSession负责应用音频的设置,比如支不支持后台,打断等

iOS音频的后台播放 锁屏

初始化AudioSession和基本配置 音频播放器采用的AVPlayer ,在程序启动的时候需要配置AudioSession,AudioSession负责应用音频的设置,比如支不支持后台,打断等等,这一步很重要,比如在viewdidload里初始化AVplayer以后要调用下面的函数: /** 设置音频会话 */  //这种方式后台,可以连续播放非网络请求歌曲,遇到网络请求歌曲就废,需要后台申请task -(void)setAudioSession{ AVAudioSession *audio

iOS开发-播放本地音频(可后台播放)

//初始化音乐 //创建音乐文件路径 NSString *musicFilePath = [[NSBundle mainBundle] pathForResource:@"eyeExe" ofType:@"mp3"]; //判断文件是否存在 if ([[NSFileManager defaultManager] fileExistsAtPath:musicFilePath]) { NSURL *musicURL = [NSURL fileURLWithPath:mu

iOS开发--QQ音乐练习,后台播放和锁屏界面

一.设置后台播放 首先允许程序后台播放 代码实现 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 3 // 设置后台播放的代码,步骤 4 // 1.获取音频的会话 5 AVAudioSession *session = [AVAudioSession sharedInstance]; 6 // 2.设置后台播放类型

IOS实现多媒体音频之音乐播放器

随着智能手机市场越来越活跃,相应的app也变得五彩缤纷,各式各样,让你的app更吸引人多媒体技术不可避免.通过对音频和视频等控制让你的app更加丰富多彩,今天和大家一起研究下基本的音频使用.本文只提供部分代码,如果疑问可以下载源码查看. 功能主界面如下: 首先引入音频播放框架 2.通过故事版搭建界面,由于该步骤很简单,这里不讲解.如图所示: 3.定义变量存放数据,并将文件中歌曲信息封装成模型放入数组 /** 加载歌曲数据*/ @property(nonatomic,strong) NSMutab

iOS AVPlayer 后台播放问题自动停止问题 防止应用被后台挂起方法

iOS AVPlayer 后台播放问题自动停止问题 防止应用被后台挂起方法 2016-09-08 16:16 1597人阅读 评论(0) 收藏 举报  分类: iOS 开发笔记(37)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1.创建播放器时创建AVAudioSession [objc] view plain copy AVAudioSession *session = [AVAudioSessionsharedInstance]; [session setCa

iOS 实现后台 播放音乐声音 AVAudioPlayer

1.步骤一:在Info.plist中,添加"Required background modes"键,value为:App plays audio 或者: 步骤二: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    self.window = [[[UIWindow alloc] initWithFrame:[[U

iOS 后台播放音频文件

首先,在info.plist里申明需要在后台播放音频内容: 添加key   UIBackgroundModes Tips:UIBackgroundModes audio键 同时还能让app使用AirPlay播放流媒体 除此之外还需要在工程中设置对AVAudioSession 进行设置: AVAudioSession *audioSession = [AVAudioSession sharedInstance]; NSError *setCategoryError = nil; BOOL succ