AudioSreamer是一个处理网络音频的功能非常强大的第三方.相比其他的音频处理框架有很多好处:AvAudioPlyer只能处理本地音频,如果需要处理网络音频,需要下载到本地才能播放.这就存在一个时间差的问题,在处理时,你可能需要等待一段时间去下载音频,只有当音频完全下载到本地时才能播放.如果音频文件很大,你需要等待更多的时间,MpMoviePlayer可以处理网络音视频,但其功能简单,如果开发功能强大的软件,MpMoviePlayer不会是一个好的选择,另外还想说一下AvPlayer,其可以实现网络音频的播放,但我感觉用起来不是很方便.
下面进入正题.实现AudioStreamer的后台播放:
1. 引入AVFoundation.Framework库文件,有时候我们在引用的时候会发现添加不到工程中去,可能是因为较高版本的SDK将其封装到AVKit框架上去了(个人猜测)只需要添加AVKit框架就行了.
2.在AppDelegate的应用启动事件里面添加以下代码:
- (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
}
3.在info.plist文件增加Required backgroud modes 选项,选择App plays audio or streams audio/video using AirPlay见下图:
4.在写音乐播放器的相关的ViewController中添加下面代码:
#pragma mark -- 视图将要出现
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//变成第一响应
[self becomeFirstResponder];
}
#pragma mark--视图将要消失
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
//取消第一响应
[self resignFirstResponder];
}
#pragma mark--后台播放及锁屏播放
- (void)remoteControlReceivedWithEvent:(UIEvent *)event{
if (event.type == UIEventTypeRemoteControl) {
switch (event.subtype) {
case UIEventSubtypeRemoteControlTogglePlayPause:
//播放按钮的响应事件
[self alticlePlayAction:self.articlePlay];
break;
case UIEventSubtypeRemoteControlPlay:
//播放按钮的响应事件
[self alticlePlayAction:self.articlePlay];
break;
case UIEventSubtypeRemoteControlPause:
//播放按钮的响应事件
[self alticlePlayAction:self.articlePlay];
break;
case UIEventSubtypeRemoteControlPreviousTrack:
//上一曲按钮的响应事件
[self alticlePreAction:self.articlePre];
break;
case UIEventSubtypeRemoteControlNextTrack:
//下一曲按钮的响应事件
[self alticleNextAction:self.articleNext];
break;
default:
break;
}
}
}
实现后台播放.亲测有效,可以实现后台播放和锁屏播放.但应注意虚拟机并不支持该功能,需真机测试.
效果: