iOS音乐播放器相关

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;

 

播放器最好设置成一个单例,还有一种思路是将整个播放器作为一个工具,这样可以直接调用上下曲等方法 

posted @ 2016-06-12 10:47  SunnyOMGi  阅读(955)  评论(0编辑  收藏  举报