IOS开发之MPMusicPlayerController

来源:互联网 发布:阿里云购买域名绑定 编辑:程序博客网 时间:2024/06/08 14:02

众所周知音乐是iOS的重要组成播放,无论是iPod、iTouch、iPhone还是iPad都可以在iTunes购买音乐或添加本地音乐到音乐库中同步到你的iOS设备。在MediaPlayer.frameowork中有一个MPMusicPlayerController用于播放音乐库中的音乐。

下面先来看一下MPMusicPlayerController的常用属性和方法:

属性说明@property (nonatomic, readonly) MPMusicPlaybackState playbackState播放器状态,枚举类型:
MPMusicPlaybackStateStopped:停止播放 MPMusicPlaybackStatePlaying:正在播放
MPMusicPlaybackStatePaused:暂停播放
MPMusicPlaybackStateInterrupted:播放中断
MPMusicPlaybackStateSeekingForward:向前查找
MPMusicPlaybackStateSeekingBackward:向后查找@property (nonatomic) MPMusicRepeatMode repeatMode重复模式,枚举类型:
MPMusicRepeatModeDefault:默认模式,使用用户的首选项(系统音乐程序设置)
MPMusicRepeatModeNone:不重复
MPMusicRepeatModeOne:单曲循环
MPMusicRepeatModeAll:在当前列表内循环@property (nonatomic) MPMusicShuffleMode shuffleMode随机播放模式,枚举类型:
MPMusicShuffleModeDefault:默认模式,使用用户首选项(系统音乐程序设置)
MPMusicShuffleModeOff:不随机播放
MPMusicShuffleModeSongs:按歌曲随机播放
MPMusicShuffleModeAlbums:按专辑随机播放@property (nonatomic, copy) MPMediaItem *nowPlayingItem正在播放的音乐项@property (nonatomic, readonly) NSUInteger indexOfNowPlayingItem 当前正在播放的音乐在播放队列中的索引@property(nonatomic, readonly) BOOL isPreparedToPlay是否准好播放准备@property(nonatomic) NSTimeInterval currentPlaybackTime当前已播放时间,单位:秒@property(nonatomic) float currentPlaybackRate当前播放速度,是一个播放速度倍率,0表示暂停播放,1代表正常速度类方法说明+ (MPMusicPlayerController *)applicationMusicPlayer;获取应用播放器,注意此类播放器无法在后台播放+ (MPMusicPlayerController *)systemMusicPlayer获取系统播放器,支持后台播放对象方法说明- (void)setQueueWithQuery:(MPMediaQuery *)query使用媒体队列设置播放源媒体队列- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection使用媒体项集合设置播放源媒体队列- (void)skipToNextItem下一曲- (void)skipToBeginning从起始位置播放- (void)skipToPreviousItem上一曲- (void)beginGeneratingPlaybackNotifications开启播放通知,注意不同于其他播放器,MPMusicPlayerController要想获得通知必须首先开启,默认情况无法获得通知- (void)endGeneratingPlaybackNotifications关闭播放通知- (void)prepareToPlay做好播放准备(加载音频到缓冲区),在使用play方法播放时如果没有做好准备回自动调用该方法- (void)play开始播放- (void)pause暂停播放- (void)stop停止播放- (void)beginSeekingForward开始向前查找(快进)- (void)beginSeekingBackward开始向后查找(快退)- (void)endSeeking结束查找通知说明
(注意:要想获得MPMusicPlayerController通知必须首先调用beginGeneratingPlaybackNotifications开启通知)MPMusicPlayerControllerPlaybackStateDidChangeNotification播放状态改变MPMusicPlayerControllerNowPlayingItemDidChangeNotification当前播放音频改变MPMusicPlayerControllerVolumeDidChangeNotification声音大小改变MPMediaPlaybackIsPreparedToPlayDidChangeNotification准备好播放
  • MPMusicPlayerController有两种播放器:applicationMusicPlayer和systemMusicPlayer,前者在应用退出后音乐播放会自动停止,后者在应用停止后不会退出播放状态。 
  • MPMusicPlayerController加载音乐不同于前面的AVAudioPlayer是通过一个文件路径来加载,而是需要一个播放队列。在MPMusicPlayerController中提供了两个方法来加载播放队列:- (void)setQueueWithQuery:(MPMediaQuery *)query- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection,正是由于它的播放音频来源是一个队列,因此MPMusicPlayerController支持上一曲、下一曲等操作。

那么接下来的问题就是如何获取MPMediaQueue或者MPMediaItemCollection?MPMediaQueue对象有一系列的类方法来获得媒体队列:

+ (MPMediaQuery *)albumsQuery;
+ (MPMediaQuery *)artistsQuery;
+ (MPMediaQuery *)songsQuery;
+ (MPMediaQuery *)playlistsQuery;
+ (MPMediaQuery *)podcastsQuery;
+ (MPMediaQuery *)audiobooksQuery;
+ (MPMediaQuery *)compilationsQuery;
+ (MPMediaQuery *)composersQuery;
+ (MPMediaQuery *)genresQuery;

有了这些方法,就可以很容易获到歌曲、播放列表、专辑媒体等媒体队列了,这样就可以通过:- (void)setQueueWithQuery:(MPMediaQuery *)query方法设置音乐来源了又或者得到MPMediaQueue之后创建MPMediaItemCollection,使用- (void)setQueueWithItemCollection:(MPMediaItemCollection *)itemCollection设置音乐来源。

有时候可能希望用户自己来选择要播放的音乐,这时可以使用MPMediaPickerController,它是一个视图控制器,类似于UIImagePickerController,选择完播放来源后可以在其代理方法中获得MPMediaItemCollection对象。

无论是通过哪种方式获得MPMusicPlayerController的媒体源,可能都希望将每个媒体的信息显示出来,这时候可以通过MPMediaItem对象获得。一个MPMediaItem代表一个媒体文件,通过它可以访问媒体标题、专辑名称、专辑封面、音乐时长等等。无论是MPMediaQueue还是MPMediaItemCollection都有一个items属性,它是MPMediaItem数组,通过这个属性可以获得MPMediaItem对象。

下面就简单看一下MPMusicPlayerController的使用,在下面的例子中简单演示了音乐的选择、播放、暂停、通知、下一曲、上一曲功能,相信有了上面的概念,代码读起来并不复杂(示例中是直接通过MPMeidaPicker进行音乐选择的,但是仍然提供了两个方法getLocalMediaQuery和getLocalMediaItemCollection来演示如何直接通过MPMediaQueue获得媒体队列或媒体集合):

////  ViewController.m//  MPMusicPlayerController////  Created by Kenshin Cui 14/03/30//  Copyright (c) 2014年 cmjstudio. All rights reserved.//#import "ViewController.h"#import <MediaPlayer/MediaPlayer.h>@interface ViewController ()<MPMediaPickerControllerDelegate>@property (nonatomic,strong) MPMediaPickerController *mediaPicker;//媒体选择控制器@property (nonatomic,strong) MPMusicPlayerController *musicPlayer; //音乐播放器@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];}-(void)dealloc{    [self.musicPlayer endGeneratingPlaybackNotifications];}/** *  获得音乐播放器 * *  @return 音乐播放器 */-(MPMusicPlayerController *)musicPlayer{    if (!_musicPlayer) {        _musicPlayer=[MPMusicPlayerController systemMusicPlayer];        [_musicPlayer beginGeneratingPlaybackNotifications];//开启通知,否则监控不到MPMusicPlayerController的通知        [self addNotification];//添加通知        //如果不使用MPMediaPickerController可以使用如下方法获得音乐库媒体队列        //[_musicPlayer setQueueWithItemCollection:[self getLocalMediaItemCollection]];    }    return _musicPlayer;}/** *  创建媒体选择器 * *  @return 媒体选择器 */-(MPMediaPickerController *)mediaPicker{    if (!_mediaPicker) {        //初始化媒体选择器,这里设置媒体类型为音乐,其实这里也可以选择视频、广播等//        _mediaPicker=[[MPMediaPickerController alloc]initWithMediaTypes:MPMediaTypeMusic];        _mediaPicker=[[MPMediaPickerController alloc]initWithMediaTypes:MPMediaTypeAny];        _mediaPicker.allowsPickingMultipleItems=YES;//允许多选//        _mediaPicker.showsCloudItems=YES;//显示icloud选项        _mediaPicker.prompt=@"请选择要播放的音乐";        _mediaPicker.delegate=self;//设置选择器代理    }    return _mediaPicker;}/** *  取得媒体队列 * *  @return 媒体队列 */-(MPMediaQuery *)getLocalMediaQuery{    MPMediaQuery *mediaQueue=[MPMediaQuery songsQuery];    for (MPMediaItem *item in mediaQueue.items) {        NSLog(@"标题:%@,%@",item.title,item.albumTitle);    }    return mediaQueue;}/** *  取得媒体集合 * *  @return 媒体集合 */-(MPMediaItemCollection *)getLocalMediaItemCollection{    MPMediaQuery *mediaQueue=[MPMediaQuery songsQuery];    NSMutableArray *array=[NSMutableArray array];    for (MPMediaItem *item in mediaQueue.items) {        [array addObject:item];        NSLog(@"标题:%@,%@",item.title,item.albumTitle);    }    MPMediaItemCollection *mediaItemCollection=[[MPMediaItemCollection alloc]initWithItems:[array copy]];    return mediaItemCollection;}#pragma mark - MPMediaPickerController代理方法//选择完成-(void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection{    MPMediaItem *mediaItem=[mediaItemCollection.items firstObject];//第一个播放音乐    //注意很多音乐信息如标题、专辑、表演者、封面、时长等信息都可以通过MPMediaItem的valueForKey:方法得到,但是从iOS7开始都有对应的属性可以直接访问//    NSString *title= [mediaItem valueForKey:MPMediaItemPropertyAlbumTitle];//    NSString *artist= [mediaItem valueForKey:MPMediaItemPropertyAlbumArtist];//    MPMediaItemArtwork *artwork= [mediaItem valueForKey:MPMediaItemPropertyArtwork];    //UIImage *image=[artwork imageWithSize:CGSizeMake(100, 100)];//专辑图片    NSLog(@"标题:%@,表演者:%@,专辑:%@",mediaItem.title ,mediaItem.artist,mediaItem.albumTitle);    [self.musicPlayer setQueueWithItemCollection:mediaItemCollection];    [self dismissViewControllerAnimated:YES completion:nil];}//取消选择-(void)mediaPickerDidCancel:(MPMediaPickerController *)mediaPicker{    [self dismissViewControllerAnimated:YES completion:nil];}#pragma mark - 通知/** *  添加通知 */-(void)addNotification{    NSNotificationCenter *notificationCenter=[NSNotificationCenter defaultCenter];    [notificationCenter addObserver:self selector:@selector(playbackStateChange:) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:self.musicPlayer];}/** *  播放状态改变通知 * *  @param notification 通知对象 */-(void)playbackStateChange:(NSNotification *)notification{    switch (self.musicPlayer.playbackState) {        case MPMusicPlaybackStatePlaying:            NSLog(@"正在播放...");            break;        case MPMusicPlaybackStatePaused:            NSLog(@"播放暂停.");            break;        case MPMusicPlaybackStateStopped:            NSLog(@"播放停止.");            break;        default:            break;    }}#pragma mark - UI事件- (IBAction)selectClick:(UIButton *)sender {    [self presentViewController:self.mediaPicker animated:YES completion:nil];}- (IBAction)playClick:(UIButton *)sender {    [self.musicPlayer play];}- (IBAction)puaseClick:(UIButton *)sender {    [self.musicPlayer pause];}- (IBAction)stopClick:(UIButton *)sender {    [self.musicPlayer stop];}- (IBAction)nextClick:(UIButton *)sender {    [self.musicPlayer skipToNextItem];}- (IBAction)prevClick:(UIButton *)sender {    [self.musicPlayer skipToPreviousItem];}@end

注释:文章转自http://www.cnblogs.com/kenshincui/p/4186022.html

0 0
原创粉丝点击