来自 电脑系统 2019-09-16 13:07 的文章
当前位置: 金沙澳门官网网址 > 电脑系统 > 正文

AVPlayer后台播放完毕,音频播放

// 告诉app支持后台播放AVAudioSession *audioSession = [AVAudioSession sharedInstance];[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];[audioSession setActive:YES error:nil];

首先要在初始化播放器的时候或者是appDelegate- application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;这个方法中加入这段代码

二:在info.plist文件中添加一个key项,防止程序进入后台时程序被 suspend

[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:@{MPMediaItemPropertyTitle:self.detailModel.sampleAudioTitle,MPMediaItemPropertyAlbumTitle:self.detailModel.sampleAuther}];
- viewWillAppear:animated{[super viewWillAppear:YES];// 开始接受远程控制[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];[self becomeFirstResponder];}- viewWillDisappear:animated{// 接触远程控制[[UIApplication sharedApplication] endReceivingRemoteControlEvents];[self resignFirstResponder];}// 重写父类成为响应者方法- canBecomeFirstResponder{return YES;}
- canBecomeFirstResponder{ return YES;}

四:对远程控制事件作出相应的操作

金沙澳门官网网址 1图形化操作界面注册后台播放

一: 在appDelegate中通知app支持后台播放

监听RouteChange事件

监听RouteChange事件,我们一般是为了实现 拔出耳机后暂停播放 这个功能。

//首先向NSNotificationCenter添加通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(routeChange:) name:AVAudioSessionRouteChangeNotification object:nil];

-routeChange:(NSNotification *)notification实现如下:

/** * 一旦输出改变则执行此方法 * * @param notification 输出改变通知对象 */-routeChange:(NSNotification *)notification{ NSDictionary *dic=notification.userInfo; int changeReason= [dic[AVAudioSessionRouteChangeReasonKey] intValue]; //等于AVAudioSessionRouteChangeReasonOldDeviceUnavailable表示旧输出不可用 if (changeReason==AVAudioSessionRouteChangeReasonOldDeviceUnavailable) { AVAudioSessionRouteDescription *routeDescription=dic[AVAudioSessionRouteChangePreviousRouteKey]; AVAudioSessionPortDescription *portDescription= [routeDescription.outputs firstObject]; //原设备为耳机则暂停 if ([portDescription.portType isEqualToString:@"Headphones"]) { if (self.playButton.selected) { [self playButtonAction:_playButton]; } } }}

一般来说如果没有实现 拔出耳机后暂停播放 ,系统会自动的把默认输出设备设置为扬声器。但是有一个例外,就是当AVAudioSessionCategory 设置为 AVAudioSessionCategoryPlayAndRecord 的时候,音频输出的默认设备是听筒而不是扬声器。这个时候如果你既不希望播放器自动暂停播放,又希望切换到扬声器播放的时候,你可能需要做如下处理,一样是在方法 -routeChange:(NSNotification *)notification; 中实现

NSError *error = nil;AVAudioSession *session = [AVAudioSession sharedInstance]; //强制设置为扬声器播放[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];

金沙澳门官网网址 ,好啦,我们的AVAudioSession 也就在这里告一段落了。仍然希望这篇文章能够帮助到有需要的朋友,有疑问的欢迎在评论中提出来,大家一起探讨!

第一步:在appDelegate中通知app支持后台播放

//告诉系统,我们要接受远程控制事件[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];[self becomeFirstResponder];
//重写父类方法,接受外部事件的处理-  remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {if (receivedEvent.type == UIEventTypeRemoteControl) {switch (receivedEvent.subtype) { // 得到事件类型case UIEventSubtypeRemoteControlTogglePlayPause: // 暂停 ios6[self actionStopButton:self.musicViewNew.stopButton]; // 调用你所在项目的暂停按钮的响应方法 下面的也是如此break;case UIEventSubtypeRemoteControlPreviousTrack: // 上一首[self actionUpButton:self.musicViewNew.upMusicButton];break;case UIEventSubtypeRemoteControlNextTrack: // 下一首[self actionDownButton:self.musicViewNew.downMusicButton];break;case UIEventSubtypeRemoteControlPlay: //播放[self actionStopButton:self.musicViewNew.stopButton];break;case UIEventSubtypeRemoteControlPause: // 暂停 ios7[self actionStopButton:self.musicViewNew.stopButton];break;default:break;}}}

好了,这个时候重新运行我们的程序home到后台后,我们的播放器就不会暂停播放了。不过这个时候我们呼出系统的控制台发现我们播放的歌曲并没有在这显示,这是因为我们呢没有告诉系统我们的app接受远程控制,下面让我们的播放器响应远程。

这样你的简单的播放音乐的app后台播放就算完成了,如果想理解锁屏后手机显示当前播放音乐的专辑以及照片的操作,且听下回分解~

激活音频会话后,我们就可以开始执行一系列跟 AVAudioSession 的服务了。

金沙澳门官网网址 2这里写图片描述

  • 向系统说明你的app使用音频的模式(比如是播放还是录音,是否支持蓝牙播放,是否支持后台播放)
  • 为你的app选择音频的输入输出设备(比如输入用的麦克风,输出是耳机、手机功放或者airplay)
  • 协助管理多个音源需要播放时的行为(例如同时使用多个音乐播放app,或者突然有电话接入)

第四步:对远程控制事件作出相应的操作

细心的朋友可能已经发现我们上一篇写好的音频播放有很大的局限性,比如:不支持后台播放、当手机处于禁音状态时也无法正常输出声音。这个时候就需要我们去激活音频会话,也就是 AVAudioSession 。激活的方法非常简单大家可以在初始化播放器的时候加上下面一段代码

第二步:在info.plist文件中添加一个key项

最后只要再实现一下- remoteControlReceivedWithEvent:(UIEvent *)receivedEvent;这个方法,我们app的远程控制功能就完成了。

在这个时候你的app就可以后台就行播放了 当时要想在手机的上拉菜单中对app进行控制就要添加以下代码

//响应远程音乐播放控制消息- remoteControlReceivedWithEvent:(UIEvent *)receivedEvent { if (receivedEvent.type == UIEventTypeRemoteControl) { switch (receivedEvent.subtype) { case UIEventSubtypeRemoteControlPlay: [self.playCenter midBtnClicked:nil]; NSLog; break; case UIEventSubtypeRemoteControlPause: [self.playCenter midBtnClicked:nil]; NSLog; break; case UIEventSubtypeRemoteControlNextTrack: NSLog; break; case UIEventSubtypeRemoteControlPreviousTrack: NSLog; break; default: break; } }}

第三步:在播放控制界面接受远程控制

可以这么说,不支持后台播放的音频类app是不完整的,但是要我们的app支持后台播放外,还需要给我们的项目设置一些参数。网上很多教程都是教的直接修改plist文件,我这里也放出来这种方法:在info.plist 文件中加入如下参数Required background modes并在item 0中写入App plays audio or streams audio/video using AirPlay。如下图

本文由金沙澳门官网网址发布于电脑系统,转载请注明出处:AVPlayer后台播放完毕,音频播放

关键词: