iOS在線音樂(lè)播放SZKAVPlayer(基于AVPlayer的封裝)

由于最近閑著沒事绪励,想找有關(guān)在線音樂(lè)播放的demo學(xué)習(xí)一下割疾,在gitHub跟code4APP上面查找了很多帖子却盘,結(jié)果很多在線音樂(lè)都是基于AudioStream實(shí)現(xiàn)的拴疤,我感覺用起來(lái)不太方便。后來(lái)突然發(fā)現(xiàn)字管,AVFoundation框架中提供了一個(gè)AVPlayer可以用來(lái)實(shí)現(xiàn)在線音樂(lè)播放啰挪,特地學(xué)習(xí)了一下,封裝成了SZKAVPlayer,與大家共享一下纤掸,筆者第一次寫這些功能文檔脐供,如果有不足或者錯(cuò)誤的地方,歡迎大家批評(píng)指正借跪。廢話不多說(shuō)政己,直接上調(diào)用的代碼:

在ViewController.m首先導(dǎo)入頭文件,并掛上SZKAVPlayerDelegate代理

#import "SZKAVPlayer.h"    

準(zhǔn)備好相關(guān)的數(shù)據(jù)源

#pragma mark---歌曲名稱數(shù)組
-(NSArray *)songNameArr
{
    _songNameArr=@[@"火星情報(bào)局 (《火星情報(bào)局》節(jié)目主題曲)",@"下一站我是你的依靠",@"世界上不存在的歌(《火鍋英雄》電影主題曲)"];
    return _songNameArr;
}
#pragma mark---歌曲流媒體地址
-(NSArray *)songArr
{
    _songArr=@[@"http://ws.stream.qqmusic.qq.com/105857360.m4a?fromtag=46",@"http://ws.stream.qqmusic.qq.com/105772207.m4a?fromtag=46",@"http://ws.stream.qqmusic.qq.com/105857409.m4a?fromtag=46"];
    return _songArr;
}
#pragma mark---歌曲演唱者數(shù)組
-(NSArray *)songAuthorArr
{
    _songAuthorArr=@[@"華晨宇",@"金志文",@"趙英俊"];
    return _songAuthorArr;
}
#pragma mark---歌曲圖片的數(shù)組
-(NSArray *)songImageArr
{
    _songImageArr=@[@"http://i.gtimg.cn/music/photo/mid_album_300/W/8/003re5702kSBW8.jpg",@"http://i.gtimg.cn/music/photo/mid_album_300/z/9/002PnERL0JwJz9.jpg",@"photo3.jpg"];
    return _songImageArr;
}

初始化player時(shí)傳入歌曲的網(wǎng)址數(shù)組跟歌曲的背景圖片數(shù)組便可實(shí)現(xiàn)當(dāng)前歌曲播放結(jié)束后,自動(dòng)播放下一首并切換player的背景圖片(支持本地圖片和網(wǎng)絡(luò)圖片)

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor=[UIColor colorWithWhite:0.875 alpha:1.000];
    //添加playerView
    [self addPlayerView];
}
#pragma mark---添加playerView
-(void)addPlayerView
{
    _player=[[SZKAVPlayer alloc]initWithFrame:CGRectMake(WIDTH/4, HEIGHT/2-WIDTH/4, WIDTH/2, WIDTH/2) andSongUrlArr:self.songArr andSongImageArr:self.songImageArr];
    _player.delegate=self;
    _player.layer.cornerRadius=WIDTH/4;
    _player.layer.masksToBounds=YES;
    _player.backgroundColor=[UIColor yellowColor];
    //設(shè)置volume掏愁,不設(shè)置默認(rèn)為0.5
    _player.volume=0.8;
    [self.view addSubview:_player];
}

實(shí)現(xiàn)代理方法可自動(dòng)返回當(dāng)前時(shí)間歇由,總共時(shí)間,歌曲進(jìn)度以及點(diǎn)擊次數(shù)果港,并且時(shí)間的格式已經(jīng)轉(zhuǎn)換成00:00的格式

#pragma mark----SZKAVPlayerDelegate代理方法
-(void)getSongCurrentTime:(NSString *)currentTime andTotalTime:(NSString *)totalTime andProgress:(CGFloat)progress andTapCount:(NSInteger)tapCount
{
    //進(jìn)度條
    [_progressView setProgress:progress];
    //歌曲時(shí)間
    _songTime.text=[NSString stringWithFormat:@"%@/%@",currentTime,totalTime];
    //歌曲名稱
    _songName.text=self.songNameArr[tapCount];
    //歌曲演唱者
    _songAuthor.text=self.songAuthorArr[tapCount];
}

player的其他操作調(diào)用SZKAVPlayer.h中相關(guān)的API即可

/**
 *  開始播放
 */
-(void)startPlay;
/**
 *  暫停播放
 */
-(void)puasePlay;
/**
 *  播放下一首
 */
-(void)nextSong;
/**
 *  播放上一首
 */
-(void)lastSong;

最終效果圖:

046379CE-59E9-4F04-8211-FE8D8B9AF388.png

SZKAVPlayer的調(diào)用方法大致就是這樣沦泌,只需要在初始化時(shí)傳入歌曲數(shù)組和歌曲圖片,便可實(shí)現(xiàn)當(dāng)前歌曲結(jié)束后辛掠,自動(dòng)播放下一首谢谦,同時(shí)切換歌曲圖片,并且代理方法中的歌曲的當(dāng)前時(shí)間萝衩,總共時(shí)間以及播放進(jìn)度回挽,也會(huì)隨著歌曲的切換而自動(dòng)刷新。

下面大致介紹一下SZKAVPlayer.m的實(shí)現(xiàn)方法
songItem和player用來(lái)初始化SZKAVPlayer

//初始化songItem和player
        _songItem=[AVPlayerItem playerItemWithURL:url];
        _player=[AVPlayer playerWithPlayerItem:_songItem];
        [_player play];

并對(duì)播放器添加了三個(gè)監(jiān)聽和一個(gè)通知

#pragma mark----監(jiān)聽播放器的加載狀態(tài)
-(void)addAVPlayerStatusObserver
{
    [_songItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
}
#pragma mark----數(shù)據(jù)緩沖狀態(tài)的監(jiān)聽
-(void)addNetDataStatusObserver
{
    [_songItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
}
#pragma mark----添加觀察者監(jiān)聽獲取當(dāng)前時(shí)間,總共時(shí)間,進(jìn)度
-(void)addTimeObserve
{
    __block  AVPlayerItem *songItem=_songItem;
    __block typeof(self) bself = self;
    _timeObserver=[_player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
        //設(shè)置player的聲音
        [bself setPlayerVolume];
        //添加背景圖片
        NSString *imagrStr=bself.imageArr[bself.tapCount];
        if (imagrStr.length<=4) {
            bself.playerImage.image=[UIImage imageNamed:bself.imageArr[bself.tapCount]];
        }else{
            NSString *imagrSubStr=[imagrStr substringWithRange:NSMakeRange(0, 4)];
            if ([imagrSubStr isEqualToString:@"http"]) {
                NSURL *imageUrl=[NSURL URLWithString:bself.imageArr[bself.tapCount]];
                [bself.playerImage setImageWithURL:imageUrl placeholderImage:[UIImage imageNamed:@"radioBG"]];
            }else{
                bself.playerImage.image=[UIImage imageNamed:bself.imageArr[bself.tapCount]];
            }
        }
        //當(dāng)前時(shí)間
        float current=CMTimeGetSeconds(time);
        //總共時(shí)間
        float total=CMTimeGetSeconds(songItem.duration);
        //進(jìn)度
        float progress=current/total;
        //將值傳入知道delegate方法中
        [bself.delegate getSongCurrentTime:[bself formatTime:current]  andTotalTime:[bself formatTime:total] andProgress:progress andTapCount:bself.tapCount];
    }];
}
#pragma mark----播放完成后發(fā)送通知
-(void)addPlayToEndObserver
{
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(playFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:_songItem];
}

為了防止在進(jìn)行下一首歌曲時(shí)候監(jiān)聽出錯(cuò)猩谊,在當(dāng)前歌曲結(jié)束后移除所有監(jiān)聽千劈,在下一首歌曲播放前再次添加監(jiān)聽,筆者親測(cè)目前這樣寫沒有出現(xiàn)什么問(wèn)題牌捷。

大致的功能原理先寫到這墙牌,筆者第一次寫涡驮,不足的地方還望各位讀者見諒,如果遇到什么問(wèn)題喜滨,可以評(píng)論回復(fù)捉捅,筆者收到后第一時(shí)間回復(fù)大家,也可以添加筆者的QQ/微信:790057066 鸿市,并且剛剛把demo上傳到了GitHub上面感興趣的朋友锯梁,可以上去下載查看即碗,記得star下焰情,非常感謝。

SZKAVPlayer鏈接 https://github.com/18811314750/SZKAVPlayer

筆者的其他文章
iOS開發(fā)-利用命令行實(shí)現(xiàn)將本地代碼上傳到GitHub
http://www.reibang.com/p/79b94add9057

iOS開發(fā)-快速調(diào)用照相機(jī)和相冊(cè)剥懒,并實(shí)現(xiàn)沙盒中照片的保存與讀取
http://www.reibang.com/p/7ffc8844e956

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末内舟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子初橘,更是在濱河造成了極大的恐慌验游,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件保檐,死亡現(xiàn)場(chǎng)離奇詭異耕蝉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)夜只,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門垒在,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扔亥,你說(shuō)我怎么就攤上這事场躯。” “怎么了旅挤?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵踢关,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我粘茄,道長(zhǎng),這世上最難降的妖魔是什么柒瓣? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任师妙,我火速辦了婚禮屹培,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薛训。我一直安慰自己仑氛,他們只是感情好锯岖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布出吹。 她就那樣靜靜地躺著捶牢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渐排。 梳的紋絲不亂的頭發(fā)上驯耻,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天吓歇,我揣著相機(jī)與錄音城看,去河邊找鬼杏慰。 笑死缘滥,一個(gè)胖子當(dāng)著我的面吹牛朝扼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榛斯,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼懂缕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搪柑!你這毒婦竟也來(lái)了索烹?” 一聲冷哼從身側(cè)響起术荤,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓣戚,失蹤者是張志新(化名)和其女友劉穎子库,沒想到半個(gè)月后仑嗅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仓技,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脖捻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年地沮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摩疑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雷袋。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡楷怒,死狀恐怖率寡,靈堂內(nèi)的尸體忽然破棺而出冶共,到底是詐尸還是另有隱情捅僵,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站酪捡,受9級(jí)特大地震影響逛薇,放射性物質(zhì)發(fā)生泄漏疏虫。R本人自食惡果不足惜卧秘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一羞福、第九天 我趴在偏房一處隱蔽的房頂上張望坯临。 院中可真熱鬧恋昼,春花似錦液肌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)额湘。三九已至锋华,卻和暖如春毯焕,著一層夾襖步出監(jiān)牢的瞬間纳猫,已是汗流浹背续担。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留询兴,地道東北人诗舰。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像属百,于是被迫代替她去往敵國(guó)和親族扰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容