天天看點

簡易音樂播放器制作

制作簡易音樂播放器:

  1.功能:音樂清單,播放,暫停,上一曲,下一曲,進度條(顯示進度時間,控制進度),随機播放,單曲循環,順序播放,歌詞顯示等

  2.使用架構:AVFoundation

  3.知識點:AVPlayer 使用,pch 檔案使用,封裝思想,MVC模式,storyBoard的使用,消息發送機制,觀察者,block回調,nstimer,nsrunloop,空間限制,第三方使用等

詳細過程:

  一.布局 :使用 storyBoard 布局

    1.歌曲清單界面:使用 TableViewController ,建立相應的 viewController , 繼承于 UITableViewController ,與 storyBoard 控件相關聯,實作相應方法

    2.播放頁面:添加相應控件,添加限制條件 , 建立相應的 viewController , 繼承于 UIViewController ,與 storyBoard 控件相關聯,實作相應方法

      難點:播放圖檔與歌詞頁面 ----> a.添加一個 ScrollView ,設定适當高度,寬度等于螢幕寬  b. 在ScrollView 添加一個 View ,與 Scroll 等高,寬度是 ScrollView 的兩倍,距 ScrollView 上下左為零,  c. 在 View 視圖添加一個兩個 UIView(播放和歌詞頁面) 子視圖,播放頁面距 view 上下左都為 0 ,寬度為螢幕寬,歌詞頁面距 view 頁面上下右 都為 0,寬度為螢幕寬.在播放頁面添加 imageView 作為播放圖檔顯示,在歌詞頁面添加 tableView 作為歌詞顯示.

  二.擷取歌曲資訊

    伺服器端資料資訊不規範,是 plist 檔案,可以直接擷取 array 形式.

  三.對擷取資訊進行解析

    1.建立 Model ,在網絡擷取到的歌詞是 NSString 類型,需要對其進行處理,轉化為兩個數組,一個存放歌詞時間資訊,一個存放歌詞内容.使用到 NSString 的 componentsSeparatedByString 方法,把字元串根據某個字元切割轉化為資料

    2.把擷取到的資料數組轉化為 Model 資料

  四.封裝播放控制類

    1.使用單例:由于播放器在一個程式中隻能有一個,如果過多會出現聲音雜亂的情況.

    2.應用 block :添加 bloak ,使得可以在 ViewController 可以通過回調控制視圖,

    3.添加監聽:用來監聽音樂的播放完成和音樂加載完成,實作其相應的操作.

       [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playToEnd) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];//監聽音樂播放完成

      [playItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];//監聽音樂加載完成

    4.應用NStimer , NSRunloop ,實作對播放的時時控制:使用回調控制 圖檔旋轉,進度條,歌詞滾動.

      self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(playTimer) userInfo:nil repeats:YES];

          //将定時器加入 runloop 中

          [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

          [self.timer fire];

    5.AVPlayer 知識點: a. AVPlayer 需要建立 AVPlayerItem ,資料的加載監聽是對他的 status 屬性德監聽  b. 計算目前播放了多少秒 CGFloat timer = _avPlayer.currentTime.value / _avPlayer.currentTime.timescale; c. 擷取歌曲總時長: _sumTime = self.avPlayer.currentItem.duration.value / self.avPlayer.currentItem.duration.timescale; d. 設定特定得時間播放點 self.avPlayer seekToTime:CMTimeMakeWithSeconds(timer * _sumTime, self.avPlayer.currentTime.timescale) completionHandler:^(BOOL finished) {}];

  五.對界面處理

    難點:對歌詞的處理 [self.lyricTableView selectRowAtIndexPath:[self lyricTableViewTime:timer] animated:YES scrollPosition:UITableViewScrollPositionMiddle];

      計算 IndexPath 方法:

    - (NSIndexPath*)lyricTableViewTime:(CGFloat)time{

        for (int i = 0 ; i < model.timerArray.count ; i++){

          CGFloat timeArray = [model.timerArray[i] AG_StringToTime];

          if (time < timeArray){

              return [NSIndexPath indexPathForItem:(i - 1 > 0 ? i - 1 : 0) inSection:0];

          }

      }

      return [NSIndexPath indexPathForItem:model.timerArray.count - 1 inSection:0];

  }

  使 cell 透明 : cell.backgroundColor = [UIColor clearColor];

  改變 cell 選中時的背景 : cell.selectedBackgroundView = view;

自己寫的小demo下載下傳

  

簡易音樂播放器制作