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