iOS 4开始引入的multitask,我们可以实现像ipod程序那样在后台播放音频了。如果音频操作是用苹果官方的AVFoundation.framework实现,像用AvAudioPlayer,AvPlayer播放的话,要实现完美的后台音频播放,依据app的功能需要,可能需要实现几个关键的功能。
首先,播放音频之前先要设置AVAudioSession模式,通常只用来播放的App可以设为AVAudioSessionCategoryPlayback即可。模式意义及其他模式请参考文档。
- AVAudioSession*session=[AVAudioSessionsharedInstance];
- [sessionsetCategory:AVAudioSessionCategoryPlaybackerror:nil];
- [sessionsetActive:YESerror: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中
- [UIApplicationsharedApplication]beginReceivingRemoteControlEvents];
否则,无法切换到下一首,接下来
- UIBackgroundTaskIdentifiernewTaskId=UIBackgroundTaskInvalid;
- [avPlayerplay];
- newTaskId=[[UIApplicationsharedApplication]beginBackgroundTaskWithExpirationHandler:NULL];
- if(newTaskId!=UIBackgroundTaskInvalid&&oldTaskId!=UIBackgroundTaskInvalid){
- [[UIApplicationsharedApplication]endBackgroundTask:oldTaskId];}
- oldTaskId=newTaskId;
当然,还有更方便的办法就是在resignActive时beginBackgroundTaskWithExpirationHandler:并在BecomeActive中endBackgroundTask:
3。我们知道,ipod播放程序在后台时,双击HOME键,会有个控制界面,可以对它进行播放控制。
如果您想让您的app可以像ipod一样在后台也可以方便的通过双击HOME键来控制,就要用到远程控制事件了。
首先在viewdidload等初始化的地方声明App接收远程控制事件,并在相应地方结束声明
- -(void)viewWillAppear:(BOOL)animated
- {
- [superviewWillAppear:animated];
- [UIApplicationsharedApplication]beginReceivingRemoteControlEvents];
- [selfbecomeFirstResponder];
- }
- -(void)viewWillDisappear:(BOOL)animated
- {
- [superviewWillDisappear:animated];
- [UIApplicationsharedApplication]endReceivingRemoteControlEvents];
- [selfresignFirstResponder];
- }
定义
- -(BOOL)canBecomeFirstResponder
- {
- returnYES;
- }
最后定义
remoteControlReceivedWithEvent,处理具体的播放、暂停、前进、后退等具体事件
- -(void)remoteControlReceivedWithEvent:(UIEvent*)receivedEvent{
- if(receivedEvent.type==UIEventTypeRemoteControl){
- switch(receivedEvent.subtype){
- caseUIEventSubtypeRemoteControlTogglePlayPause:
- [selfplayButtonPressed:playButton];
- [selftesting];
- break;
- caseUIEventSubtypeRemoteControlPreviousTrack:
- [selfrewButtonReleased:(UIButton*)rewButton];
- break;
- caseUIEventSubtypeRemoteControlNextTrack:
- [selfffwButtonReleased:(UIButton*)ffwButton];
- break;
- default:
- break;
- }
- }
- }
4. 至此,您有播放App已经相当完美了,还有最后一个问题,那就是当用户使用耳机时,问题又来了。系统默认当插入耳机时,正在播放的声音不中断,直接切换到耳机播放,而当拔出耳机时,播放停止。如果这种行为满足您的要求,那OK,否则您就需要进一步研究耳机检测和声音路由切换的问题。
分享到:
相关推荐
iOS AVPlayer播放暂停功能示例demo,供视频初学者学习。
AVPlayer 处理音频和视频的播放 1.支持缓存loading,远程url播放 2.播放组件UI 3.持续更新中,已完成音频部分 下载地址:https://github.com/xilankong/VedioPlayer
本demo借鉴某博客(地址忘了,致敬大神), 基于IOS自带的AVPlayer 实现了简单在线播放音频的功能。 该demo支持上一首,下一首, 进度条拖动进度。 也支持各种播放模式:如顺序播放,单曲循环,随机播放(伪随机)等。 ...
本文主要给大家介绍了关于iOS AVPlayer切换播放源实现连续播放和全屏切换的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: AVPlayer 切换播放源有三种方式: 第一种:采用系统自带的方法: [self....
ios AVPlayer视频播放DEMO
iOS AVPlayer自定义在线视频界面完美支持横竖屏。关于横竖屏可参照我的博客详细说明,对于自定义视频界面,也只需要简单地替换UI 图片就可以。
基于AVPlayer的音乐播放器,支持上下曲,随机播放,后台播放及控制 Github链接:https://github.com/i-claudeli/audioPlayer 支持横竖屏,快进/退,视频播放器:https://github.com/ClaudeLi/AVPlayer
对 AVPlayer 的封装,支持本地和远程音频的播放
ios avplayer 的最基本使用,几行代码,快速了解怎么使用avplayer.
(1) 离线播放:这里并不是指应用不联网,而是指播放本地音频文件,包括先下完完成音频文件再进行播放的情况,这种使用AVFoundation里的AVAudioPlayer可以满足 (2) 在线播放:使用AVFoundation的AVPlayer可以...
使用AVPlayer自定义UI,可实现在ViewController,cell上播放,以及小窗口显示播放
iOS 基于AVPlayer的视频播放器,实现播放、暂停、全屏、进度条,缓冲条
iOS之AVPlayer使用实例,好好看吧。
s绍d本博客s绍如何使用3A=PEyIV进行播放c暂:copyright:c视频切换c循环播放c跳转到指定时间c并精准定位c包含对3A=PEyIV播放器的监听等添加播放器c播放视频
我们自己用AVPlayer实现一些视频播放的定制开发。AVPlayer属于AVFoundation框架,可以播放视频、音频,支持本地、网络视频源,相对来说更加接近底层。
iOS 使用lame库将音频转化MP3会发现通过player获取时长与原文件时长不符,本文主要解决该问题
avplayer视频播放的缓存技术,通俗的讲就是视频边下载边播放 已经下载的部分需要缓存起来,下次播放或者快进、快退或者无网络时到播放到缓存的部分可以直接播放不用下载。
这是一个简单的视频播放Demo,把AVPlayer 做了简单的封装 。支持 全屏。
检测资源是否可用,切换线路。
1.基于AVPlayer的封装. 2.支持用户左右滑动调节进度,上下滑动控制声音. 3.支持缓冲进度条,并可以修改缓冲进度条颜色 //XHPlayerProgressView -> bufferProgressTintColor (默认是greenColor) 4.支持全屏(添加到...