iOS音乐播放器框架主要有两大类:AvPlayer、AvaudioPlayer
AvPlayer 能播放本地及网络歌曲
AvaudioPlayer 能播放本地歌曲、有相关代理方法(其实也可以播放网络歌曲,只不过该播放器播放网络歌曲是先将歌曲下载下来再进行播放)
下面记录一下相关要用到的方法
1.获取本地歌曲库(ipod路径)歌曲
// 读取本地音乐
MPMediaPropertyPredicate *albumNamePredicate =
[MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInt:MPMediaTypeMusic ] forProperty: MPMediaItemPropertyMediaType];
[everything addFilterPredicate:albumNamePredicate];
_itemsFromGenericQuery = [everything items];
2.锁屏状态下的歌曲名、歌手名、专辑图设置
//锁屏
- (void)configPlayingInfo
{
if (NSClassFromString(@"MPNowPlayingInfoCenter"))
{
NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
if (_songName&&_singer) {
[dict setObject:_songName forKey:MPMediaItemPropertyTitle];//歌曲名设置
[dict setObject:_singer forKey:MPMediaItemPropertyArtist];//歌手名设置
if (![imgURL isEqualToString:@"专辑默认背景"] && imgURL.length > 0 )
{
[dict setObject:[[MPMediaItemArtwork alloc] initWithImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imgURL] options:NSUTF8StringEncoding error:nil]]] forKey:MPMediaItemPropertyArtwork];//专辑图片设置
}
else
{
[dict setObject:[[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:@"专辑默认背景"]] forKey:MPMediaItemPropertyArtwork];//专辑图片设置
}
}
[dict setObject:[NSNumber numberWithDouble:CMTimeGetSeconds(self.avplayer.currentItem.currentTime)] forKey:MPNowPlayingInfoPropertyElapsedPlaybackTime]; //音乐当前已经播放时间
[dict setObject:[NSNumber numberWithFloat:1.0] forKey:MPNowPlayingInfoPropertyPlaybackRate];//进度光标的速度(这个随自己的播放速率调整,默认是原速播放)
[dict setObject:[NSNumber numberWithDouble:CMTimeGetSeconds(self.avplayer.currentItem.duration)] forKey:MPMediaItemPropertyPlaybackDuration];//歌曲总时间设置
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:dict];
}
}
3.如果播放的歌曲为网络歌曲,则要设置一下后台控制打断的事件,否则无法进行正常的自动下一曲
//后台播放相关,且将蓝牙重新连接
-(void)setAudioSession{
//AudioSessionInitialize用于控制打断
//这种方式后台,可以连续播放非网络请求歌曲,遇到网络请求歌曲就废,需要后台申请task
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *setCategoryError = nil;
BOOL success = [session setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];
if (!success)
{
return;
}
NSError *activationError = nil;
success = [session setActive:YES error:&activationError];
if (!success)
{
return;
}
}
4.因为AvPlayer是没有队列这个概念,只能播放一首歌曲,所以每次播放完毕都监听一次以便进行自动下一曲
//监听是否播放完毕
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];
//结束播放
- (void)playEnd:(id)sender
{
[self next];(next是私有方法)
return;
}
5.在播放器程序中一点小的心得
如果要让播放器接受远程控制则要设置第一响应状态
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
//设置为第一响应
-(BOOL)canBecomeFirstResponder{
return YES;
}
后台控制(耳机线控制)
-(void)remoteControlReceivedWithEvent: (UIEvent *) receivedEvent;
播放器最好设置成一个单例,还有一种思路是将整个播放器作为一个工具,这样可以直接调用上下曲等方法