2017-03-07 41 views
3

我正在創建一個簡單的音樂應用程序,我想知道如何讓UiSlider跟蹤音頻文件的進度。這裏是我的項目迄今:如何使UISlider匹配音頻進度

Storyboard

代碼:

import UIKit 
import AVFoundation 

class SongDetailViewController: UITableViewController { 

    var audioPlayer = AVAudioPlayer() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     do { 
      audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "Song Name", ofType: "mp3")!)) 
      audioPlayer.prepareToPlay() 

      var audioSession = AVAudioSession.sharedInstance() 

      do { 
       try audioSession.setCategory(AVAudioSessionCategoryPlayback) 
      } 
     } 

     catch { 
      print(error) 
     } 
    } 
// Buttons 

// Dismiss 
    @IBAction func dismiss(_ sender: Any) { 
     dismiss(animated: true, completion: nil) 
    } 

// Play 
    @IBAction func play(_ sender: Any) { 
     audioPlayer.stop() 
     audioPlayer.play() 
    } 

// Pause 
    @IBAction func pause(_ sender: Any) { 
     audioPlayer.pause() 
    } 

// Restart 
    @IBAction func restart(_ sender: Any) { 
     audioPlayer.currentTime = 0 
    } 

} 

我想創建一個類似於它跟隨該音頻文件的進度蘋果音樂應用程序的uislider並且只要用戶滑動球的東西(哈哈)它去那首歌的時間。如果你可以給我一些代碼來完成這個,那太棒了!

請記住,我是相當新的編碼,我仍然學習迅速,所以保持簡單:-)再次感謝!

回答

1

如果您切換到使用AVPlayer,則可以將periodicTimeObserver添加到AVPlayer。在下面的例子中,你會得到一個回調每1/30秒......

let player = AVPlayer(url: Bundle.main.url(forResource: "Song Name", withExtension: "mp3")!) 

player.addPeriodicTimeObserver(forInterval: CMTimeMake(1, 30), queue: .main) { time in 

    let fraction = CMTimeGetSeconds(time)/CMTimeGetSeconds(player.currentItem!.duration) 

    self.slider.value = fraction 
} 

如果你在你的代碼中創建一個audioPlayer,與上面的代碼替換。

+0

好吧,那麼,你可以把我的代碼放在上面,並把它放到100%完成的地方嗎?如果您需要爲滑塊設置IB插座,請將其插入。這可以嗎?非常感謝!! – iFunnyVlogger

+1

您是否認爲自己可以嘗試一下,如果仍然有問題,請更新您的問題? –

+0

我應該在哪裏用你的代碼替換我的代碼? – iFunnyVlogger

1

使用AVAudioPlayer你可以創建一個週期性的計時器,閃光幾次第二(高達60次/秒 - 更多的將是一種浪費),並更新根據您的音頻播放器的currentTime財產的滑塊。要將更新與屏幕刷新同步,您可以使用CADisplayLink定時器。

它也應該能夠建立一個鍵值觀察你的AVAudioPlayer小號currentTime屬性,因此每次值更改您的觀察者大火。 (我沒有嘗試過,但它應該工作。)