iOS-在線音樂播放器其實(shí)很easy汁

前言

最近在做項(xiàng)目的時候需要用到一個在線的音樂播放器, 但是這個音樂播放器只需要播放一首歌, 而且要求能快進(jìn)快退, 由于比較簡單, 適合初學(xué)者學(xué)習(xí), 所以我特意封裝了一下, 并寫了一個小小的demo, 代碼都在github上, 眾多iOS學(xué)習(xí)愛好者有興趣的話可以前往下載. github地址

特點(diǎn)

  • 體量小
  • 簡單易用
  • 支持單首歌曲的播放,快進(jìn),快退
  • 支持播放進(jìn)度條的拖動以及點(diǎn)擊

使用方法

  1. 下載并復(fù)制KHPlayer文件夾下的源代碼到你的工程目錄
  • 注意:如果想使用原資源圖片, 一定要把Assets里的圖片一起復(fù)制過去
  1. 初始化KHPlayer, 賦值Frame, 并添加到當(dāng)前視圖中
 KHPlayer *player = [[KHPlayer alloc] initWithFrame:CGRectMake(0, CGRectGetHeight(self.view.frame) - 70, CGRectGetWidth(self.view.frame),70)];
 [self.view addSubview:player];
  1. 設(shè)置相關(guān)的UI屬性
 [player setSliderThumbImage:[UIImage imageNamed:@"yinpinThumb"]];
  [player enableMasksToBoundsOfSlider];
  [player setBgColor:[UIColor whiteColor]];
  1. 設(shè)置要播放的在線音頻URL的String值, 并調(diào)用play方法進(jìn)行播放
[player setURLString: kInterface1];
   [player play];

完成以上操作后得到的效果如下:

后續(xù)工作

  • 添加播放本地音頻的接口
  • 添加連續(xù)播放多首歌的功能

核心代碼

其實(shí)最核心的代碼是給播放器添加KVO監(jiān)聽事件, 所以在這里只展示這部分代碼

//添加在線播放的音頻URL
- (void)setURLString:(NSString *)urlString{
    _urlString = urlString;
    
    if (self.currentItem) {
        [self.currentItem removeObserver:self forKeyPath:@"status"];
        [self.currentItem removeObserver:self forKeyPath:@"playbackBufferEmpty"];
        [self.currentItem removeObserver:self forKeyPath:@"playbackLikelyToKeepUp"];
        self.currentItem = nil;
    }
    if (self.player) {
        self.player = nil;
    }
    if (self.progressSlider) {
        self.progressSlider.value = 0;
    }
    
    //給playerItem添加KVO事件
    self.currentItem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:urlString]];
    [self.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
    [self.currentItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil];
    [self.currentItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];
    
    self.player = [[AVPlayer alloc] initWithPlayerItem:self.currentItem];
}
/*
 使用KVO監(jiān)聽播放狀態(tài)
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    if ([keyPath isEqualToString:@"status"])
    {
        //準(zhǔn)備播放
        if ([change[NSKeyValueChangeNewKey] integerValue] == AVPlayerItemStatusReadyToPlay)
        {
            self.duration = CMTimeGetSeconds(self.currentItem.duration);
            self.rightTimeLabel.text = [self timeFormatWithTimtInterval:_duration];
            [self updatePlayerProgress];
            [self hideLoadingView];
            [self enableButtons];
        }
        else if ([change[NSKeyValueChangeNewKey] integerValue] == AVPlayerItemStatusFailed)
        {
            [self showLoadingView];
            [self disableButtons];
            NSLog(@"播放失敗");
        }
        else if ([change[NSKeyValueChangeNewKey] integerValue] == AVPlayerItemStatusUnknown)
        {
            [self showLoadingView];
            [self disableButtons];
            NSLog(@"未知錯誤");
        }
        
    }
    else if ([keyPath isEqualToString:@"playbackBufferEmpty"])
    {
        if (self.currentItem.playbackBufferEmpty) {
            [self showLoadingView];
            self.progressSlider.value = 0;
            [self disableButtons];
        }
    }
    else if ([keyPath isEqualToString:@"playbackLikelyToKeepUp"])
    {
        [self showLoadingView];
        
        if (self.currentItem.playbackLikelyToKeepUp) {
            [self hideLoadingView];
            [self enableButtons];
        }
    }
}
/*
 設(shè)置定時器,更新播放狀態(tài)
 */
- (void)updatePlayerProgress{
    __weak typeof(self) weakSelf = self;
    [_player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(0.5, NSEC_PER_SEC) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
    //更新左右的時間Label, 修改進(jìn)度條進(jìn)度(這里要用weakSelf來防止循環(huán)引用)
        CGFloat currentTime = CMTimeGetSeconds(weakSelf.currentItem.currentTime);
        weakSelf.currentTime = currentTime;
        weakSelf.leftTimeLabel.text = [weakSelf timeFormatWithTimtInterval:currentTime];
        
        CGFloat leftTime = weakSelf.duration - currentTime;
        weakSelf.rightTimeLabel.text = [weakSelf timeFormatWithTimtInterval:leftTime];
        weakSelf.progressSlider.value = currentTime / weakSelf.duration;
    }];
}

寫在結(jié)尾的話

有興趣了解所有代碼和Demo的朋友, 還是那句話, 可以去我github地址下載. 覺得還不錯的話不妨給我點(diǎn)個星哈~最后, 如果覺得代碼哪里有問題,或者有新的的需求想添加上去粱侣,歡迎留下你的評論.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末醉冤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宵呛,更是在濱河造成了極大的恐慌单匣,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宝穗,死亡現(xiàn)場離奇詭異户秤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逮矛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門鸡号,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人橱鹏,你說我怎么就攤上這事膜蠢。” “怎么了莉兰?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵挑围,是天一觀的道長。 經(jīng)常有香客問我糖荒,道長杉辙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任捶朵,我火速辦了婚禮蜘矢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘综看。我一直安慰自己品腹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布红碑。 她就那樣靜靜地躺著舞吭,像睡著了一般泡垃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羡鸥,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天蔑穴,我揣著相機(jī)與錄音,去河邊找鬼惧浴。 笑死存和,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衷旅。 我是一名探鬼主播捐腿,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芜茵!你這毒婦竟也來了叙量?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤九串,失蹤者是張志新(化名)和其女友劉穎绞佩,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猪钮,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡品山,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烤低。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肘交。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扑馁,靈堂內(nèi)的尸體忽然破棺而出涯呻,到底是詐尸還是另有隱情,我是刑警寧澤腻要,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布复罐,位于F島的核電站,受9級特大地震影響雄家,放射性物質(zhì)發(fā)生泄漏效诅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一趟济、第九天 我趴在偏房一處隱蔽的房頂上張望乱投。 院中可真熱鬧,春花似錦顷编、人聲如沸戚炫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘹悼。三九已至叛甫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杨伙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工萌腿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留限匣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓毁菱,卻偏偏與公主長得像米死,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贮庞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

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