iOS 音频播放 —— iPod Library

作者: LonlyCat | 来源:发表于2015-12-01 19:58 被阅读1103次

    iPod Library歌曲(也称作本地音乐库歌曲)也就是用户从iTunes中导入的歌曲。现在市面上任何一款成熟的播放器也都支持�这个功能,所以如果在被养惯了的用户面前这个功能的开发是必不可少的。

    访问 iPod Library

    在安卓中开发者可能不必要面临这种问题,只要你的歌是放在磁盘上的我就能给你找出来!但这一套在iOS系统沙盒机制的面前缺无法建功,对于iOS来说,我们如果想要播放iPod Library歌曲就必须要先访问到iPod Library。苹果官方文档中给出了一张非常形象的图片


    效果图
    以上就是简单的对 MPMediaPickerController 的应用,可以看到作为苹果高度封装的一个类,留个我们自定义的地方很少,可以认为基本上不能自定义。不过怎么说,虽然目前我也没有发现有哪个app使用的这个方法来加载* iPod Library * 中的歌曲,但还是提一下吧,大家就当科普好了= = 。

    MediaQuery

    根据命名估计大家也能猜到一些,MediaQuery 其实就好像数据库的SELET语句。我们通过MediaQuery可以直接访问iPod Library的DB,并根据需要获取iPod Library中的音频文件。

    MediaQuery 的简单用法: MediaQuery 这个类本身已经封装好了一些方法,足矣满足我们正常的开发需求,类似于QQ播放器中显示全部本地歌曲就只需要调用下 [MPMediaQuery songsQuery] 返回所有歌曲列表就好了。

    //大家看名字也就知道是什么意思了,我就不一一解释了,如果有必要可以求助有道。
    + (MPMediaQuery *)albumsQuery;
    + (MPMediaQuery *)artistsQuery;
    + (MPMediaQuery *)songsQuery;
    + (MPMediaQuery *)playlistsQuery;
    + (MPMediaQuery *)podcastsQuery;
    + (MPMediaQuery *)audiobooksQuery;
    + (MPMediaQuery *)compilationsQuery;
    + (MPMediaQuery *)composersQuery;
    + (MPMediaQuery *)genresQuery;
    

    不过如果你非要自己手写查询代码的话就参考下面这段代码吧

    MPMediaPropertyPredicate *artistNamePredicate =[MPMediaPropertyPredicate predicateWithValue:@"Happy the Clown"    //查询谓语也就是关键字
                                                                                    forProperty:MPMediaItemPropertyArtist   //要查询的�属性
                                                                                  comparisonType:MPMediaPredicateComparisonEqualTo];  //关键字匹配的方案:相同 or 包含
    MPMediaQuery *quert = [[MPMediaQuery alloc] init];
    //添加查询语句
    [quert addFilterPredicate: artistNamePredicate];
    //设置查询后返回的集合类型
    quert.groupingType = MPMediaGroupingArtist;
    //集合里是MPMediaItem
    NSArray *itemsFromArtistQuery = [quert items];
    //集合里是MPMediaItemCollection
    NSArray *collectionsFromArtistQuery = [quert collections];
    

    还有一点要说明的 MediaCollectionMediaItem 的合集可以通过访问它的 items 属性来访问所有的 MediaItem

    好了,现在我们就已经拿到需要的音频对象的列表了。如果你没有忘记我们前两章节的内容,到了这里你就可以自己思考下怎么使用现有的内容完成一个 iPod Library 播放器。
    下面我们来会使用一个新的类MPMusicPlayerController来播放我们 iPod Library 中的歌曲。(使用下面介绍的两个方法来播放,一样会有很大的局限性,这里的目的还是科普为主)

    // 通过MPMusicPlayerController的类方法可以生成的两种播放器 applicationMusicPlayer 不会继承iPhone自带音乐播放器中的播放状态,相当于一个独立的播放器;而 systemMusicPlayer 则完全继承iPod应用的播放状态(甚至是播放时间),对其实例的任何操作也会覆盖到iPhone自带音乐播放器
    + (MPMusicPlayerController *)applicationMusicPlayer;  //局限:无法后台播放
    + (MPMusicPlayerController *)iPodMusicPlayer;  //已经弃用,使用下面一个方法
    + (MPMusicPlayerController *)systemMusicPlayer;  //局限:�实质是调用的系统播放器,如果你的应用crash了或者被kill了,音乐不会自动停止。
    

    下面是应用示例

    #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];
        // Do any additional setup after loading the view, typically from a nib.
        _musicPlayer=[MPMusicPlayerController systemMusicPlayer];
        //1、开启通知,监控MPMusicPlayerController的通知
        [_musicPlayer beginGeneratingPlaybackNotifications];
        [self addNotification];
        //2、获得音乐库媒体队列
        [_musicPlayer setQueueWithItemCollection:[self getLocalMediaItemCollection]];
    }
    
    /**
     *  取得媒体队列
     */
    -(MPMediaQuery *)getLocalMediaQuery{
        MPMediaQuery *mediaQueue=[MPMediaQuery songsQuery];
        for (MPMediaItem *item in mediaQueue.items) {
            NSLog(@"标题:%@,%@",item.title,item.albumTitle);
        }
        return mediaQueue;
    }
    
    #pragma mark - 通知
    /**
     *  添加通知
     */
    -(void)addNotification{
        NSNotificationCenter *notificationCenter=[NSNotificationCenter defaultCenter];
        [notificationCenter addObserver:self selector:@selector(playbackStateChange:) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:self.musicPlayer];
    }
    
    /**
     *  播放状态改变通知
     */
    -(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)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];
    }
    

    我们的 MPMusicPlayerController 就在这结束吧,由于实际开发中是不会选择这种方法的,所以对这个类的讲解也算是浅尝辄止,如果有兴趣的朋友可以自己去翻阅下官方文档

    相关文章

      网友评论

        本文标题:iOS 音频播放 —— iPod Library

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