• AVFoundation(二)---MPMusicPlayerController


    话不多说,直接上代码,代码中详细介绍了如何初始化,并设置一些常用的属性。

        /**
         *  MPMusicPlayerController用于播放音乐库中的音乐
         */
        /**
         *  初始化MPMusicPlayerController,类方法
         
         + (MPMusicPlayerController *)applicationMusicPlayer; 
            获取应用播放器,注意此类播放器无法在后台播放
         
         + (MPMusicPlayerController *)systemMusicPlayer     
            获取系统播放器,支持后台播放
         */
        MPMusicPlayerController *musicplayervc = [MPMusicPlayerController systemMusicPlayer];
        /**
         * MPMusicPlayerController的对象属性
         */
        //@property (nonatomic, readonly) MPMusicPlaybackState playbackState
        /*
         播放器状态,枚举类型:
         MPMusicPlaybackStateStopped:停止播放
         MPMusicPlaybackStatePlaying:正在播放
         MPMusicPlaybackStatePaused:暂停播放
         MPMusicPlaybackStateInterrupted:播放中断
         MPMusicPlaybackStateSeekingForward:向前查找
         MPMusicPlaybackStateSeekingBackward:向后查找
         */
        if (musicplayervc.playbackState == MPMusicPlaybackStateStopped) {
            NSLog(@"停止播放");
        }
        
        /*
             @property (nonatomic) MPMusicRepeatMode repeatMode
             重复模式,枚举类型:
             MPMusicRepeatModeDefault:默认模式,使用用户的首选项(系统音乐程序设置)
             MPMusicRepeatModeNone:不重复
             MPMusicRepeatModeOne:单曲循环
             MPMusicRepeatModeAll:在当前列表内循环
         */
        musicplayervc.repeatMode = MPMusicRepeatModeNone;
        
        /*
             @property (nonatomic) MPMusicShuffleMode shuffleMode
             随机播放模式,枚举类型:
             MPMusicShuffleModeDefault:默认模式,使用用户首选项(系统音乐程序设置)
             MPMusicShuffleModeOff:不随机播放
             MPMusicShuffleModeSongs:按歌曲随机播放
             MPMusicShuffleModeAlbums:按专辑随机播放
         */
        musicplayervc.shuffleMode = MPMusicShuffleModeOff;
        
        /*
            @property (nonatomic, copy) MPMediaItem *nowPlayingItem
            正在播放的音乐项
         */
        MPMediaItem *item = musicplayervc.nowPlayingItem;
        
        /*
            @property (nonatomic, readonly) NSUInteger indexOfNowPlayingItem 
            当前正在播放的音乐在播放队列中的索引
         */
        NSUInteger index = musicplayervc.indexOfNowPlayingItem;
        
        /*
            @property(nonatomic, readonly) BOOL isPreparedToPlay 
            是否准好播放准备
         */
        BOOL isOK = musicplayervc.isPreparedToPlay;
        
        /*
            @property(nonatomic) NSTimeInterval currentPlaybackTime     
            当前已播放时间,单位:秒
         */
        NSTimeInterval currentTime = musicplayervc.currentPlaybackTime;
        
        /*
            @property(nonatomic) float currentPlaybackRate     
            当前播放速度,是一个播放速度倍率,0表示暂停播放,1代表正常速度
         */
        float playrate = musicplayervc.currentPlaybackRate;
        
        /**
         *  常用的对象方法
         */
        /*
         - (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     结束查找
         */
        
        /*
            通知:
         MPMusicPlayerControllerPlaybackStateDidChangeNotification     播放状态改变
         MPMusicPlayerControllerNowPlayingItemDidChangeNotification     当前播放音频改变
         MPMusicPlayerControllerVolumeDidChangeNotification     声音大小改变
         MPMediaPlaybackIsPreparedToPlayDidChangeNotification     准备好播放
         */
        

    举个例子:下边代码是写了一个播放系统音乐的功能

    #import "ViewController.h"
    #import <MediaPlayer/MediaPlayer.h>
    
    @interface ViewController ()<MPMediaPickerControllerDelegate>
    
    /**
     *  媒体选择控制器
     */
    @property (strong,nonatomic) MPMediaPickerController *mediaPicker;
    
    /**
     *  音乐播放器
     */
    @property (strong,nonatomic) MPMusicPlayerController *musicPlayer;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
    }
    /**
     *  获得音乐播放器
     */
    -(MPMusicPlayerController *)musicPlayer{
        if (!_musicPlayer) {
            _musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
            _musicPlayer.repeatMode = MPMusicRepeatModeNone;
            //开启通知,否则监控不到MPMusicPlayerController的通知
            [_musicPlayer beginGeneratingPlaybackNotifications];
            //添加通知
            [self addNotification];
        }
        return _musicPlayer;
    }
    /**
     *  媒体选择器
     */
    -(MPMediaPickerController *)mediaPicker{
        if (!_mediaPicker) {
            //初始化媒体选择器,这里设置媒体类型为音乐,其实这里也可以选择视频、广播等
            _mediaPicker = [[MPMediaPickerController alloc]initWithMediaTypes:MPMediaTypeMusic];
            //多选
            _mediaPicker.allowsPickingMultipleItems = YES;
            _mediaPicker.prompt = @"请选择要播放的音乐";
    
            //设置选择器代理
            _mediaPicker.delegate = self;
        }
        return _mediaPicker;
    }
    
    /*
        取得媒体队列
     */
    -(MPMediaQuery *)getLocalMediaQuery{
        MPMediaQuery *mediaQueue = [MPMediaQuery songsQuery];
        for (MPMediaItem * item in mediaQueue.items) {
            NSLog(@"标题:%@,%@",item.title,item.albumTitle);
        }
        return mediaQueue;
    }
    
    /*
        取得媒体集合
     */
    -(MPMediaItemCollection *)getLocalMediaItemCollection{
        MPMediaQuery *mediaQueue = [MPMediaQuery songsQuery];
        NSMutableArray *arr = [NSMutableArray array];
        for (MPMediaItem *item in mediaQueue.items) {
            [arr addObject:item];
            NSLog(@"标题:%@,%@",item.title,item.albumTitle);
        }
        MPMediaItemCollection *mediaItemCollection = [[MPMediaItemCollection alloc]initWithItems:[arr 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(@"正在播放...%@",self.musicPlayer.nowPlayingItem.title);
                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];
    }
  • 相关阅读:
    gitbook 入门
    mac 手动卸载软件位置
    idea 版本控制忽略文件、文件夹设置
    Mac .DS_Store 隐藏文件和清理.DS_Store的方法
    mac 打开整个系统的隐藏文件
    js拼接字符串,字符串转数组
    新一代 javascript 模板引擎:artTemplate-3.0
    webpack+express多页站点开发
    Vue2学习笔记:组件(Component)
    Vue2学习笔记:过渡效果css
  • 原文地址:https://www.cnblogs.com/iOSDeng/p/5089283.html
Copyright © 2020-2023  润新知