2017-06-02 40 views
0

我使用AVPlayer播放音頻文件。我有問題。 UISlider不能正常工作時,滑塊應移動的進度視圖,當您單擊停止當您單擊停止音頻的音頻再次播放UISlider無法正常使用AVPlayer

@IBAction func play(_ sender: Any) { 

let url = URL(string: self.urlAudio[0]) 
let playerItem = AVPlayerItem(url: url!) 
player = AVPlayer(playerItem:playerItem) 
player.rate = 1.0; 
player.play() 


let duration : CMTime = playerItem.asset.duration 
let seconds : Float64 = CMTimeGetSeconds(duration) 

playbackSlider.maximumValue = Float(seconds) 
playbackSlider.isContinuous = true 
playbackSlider.tintColor = UIColor.green 

playbackSlider.addTarget(self, action: #selector(ViewControllerAudioDetail.playbackSliderValueChanged(_:)), for: .valueChanged) 

if soundChange == true{ 
    playChange.setImage(UIImage(named:"Pause.png"), for: UIControlState.normal) 
    soundChange = false 
    player.play() 
} else { 
    playChange.setImage(UIImage(named:"Play.png"), for: UIControlState.normal) 
    soundChange = true 
    player.pause() 
} 

} 

func playbackSliderValueChanged(_ playbackSlider:UISlider){ 

let seconds : Int64 = Int64(playbackSlider.value) 
let targetTime:CMTime = CMTimeMake(seconds, 1) 

player.seek(to: targetTime) 

} 
+0

爲你必須讓時間停止的時候,並點擊播放後,再從那個時候 –

回答

0

再次發揮

爲了切換播放並暫停檢查avplayer是否已經播放。如果玩暫停播放它。

if player.rate == 0 { 
    player.play() 
    //change your button image 
} 
else { 
    player.pause() 
    //change your button image 
} 

滑塊應移動的進度視圖

您可以使用AVPlayer的PeriodicTime觀察員更新您的滑塊進步

let _ = player.addPeriodicTimeObserver(forInterval: CMTime(seconds: 1, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: DispatchQueue.main) { [weak self] (time) in 
     self?.audioPlayerSlider.value = Float(CMTimeGetSeconds(time))/Float(totalDuration) 
    } 

PS:

唐不會創造球員每次用戶點擊按鈕時都會觸發。僅在玩家爲零或您想要玩不同的軌道時創建。

@IBAction func play(_ sender: Any) { 
    if player == nil { 
     let url = URL(string: self.urlAudio[0]) 
     let playerItem = AVPlayerItem(url: url!) 
     player = AVPlayer(playerItem:playerItem) 
     player.rate = 1.0; 
    } 
    if player.rate == 0 { 
     player.play() 
     //change your button image 
    } 
    else { 
     player.pause() 
     //change your button image 
    } 
} 

編輯:

我相信你正在努力尋找一種方法來擦洗/尋求到AVPlayer播放音頻的具體時間。

您可以使用AVPlayer的seek方法來做到這一點。

@IBAction func audioSliderDragged(_ sender: AnyObject) { 
     let value = self.audioPlayerSlider.value 
     let durationToSeek = Float(totalDuration) * value 
     player.seek(to: CMTimeMakeWithSeconds(Float64(durationToSeek),player.currentItem!.duration.timescale)) { [weak self](state) in 
      //do what is relevant to your app on seeing to particular offset    
     } 
} 
+0

開始當我按下停止和播放音頻重新戲劇和後滑塊不能切換到我想要的地步 – Vasya2014

+0

@ Vasya2014:你可以更具體一些你的要求嗎?我沒有得到你在說什麼 –

+0

當音頻停止並且播放繼續時,音頻重新播放,並且滑塊的問題是它不能切換到歌曲的任何部分 – Vasya2014