美文网首页ios ios视频相关ios-音频
iOS音视频学习4——播放iTunes音乐

iOS音视频学习4——播放iTunes音乐

作者: Realank | 来源:发表于2016-03-28 13:56 被阅读870次
    播放音乐库中的音乐

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

    MPMusicPlayerController的常用属性和方法:

    属性
    类方法
    对象方法
    通知
    • 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进行音乐选择的,但是仍然提供了两个方法getLocalMediaQuerygetLocalMediaItemCollection来演示如何直接通过MPMediaQueue获得媒体队列或媒体集合):

    //
    //  ViewController.m
    
    #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
    

    相关文章

      网友评论

        本文标题:iOS音视频学习4——播放iTunes音乐

        本文链接:https://www.haomeiwen.com/subject/kapjlttx.html