Uislider与Avplayer无法正常工作



我使用avplayer播放音频文件。我有问题。Uislider无法正常工作,滑块应作为进度视图移动,当您单击"停止"音频时,再次播放音频

@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)
}

单击停止时,音频再次播放

为了切换播放并暂停检查Avplayer是否已经在播放。如果暂停播放,请播放它。

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

滑块应作为进度视图移动

您可以使用Avplayer的过时观察者来更新您的滑块进度

    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)
    }

P.S:

不要在按钮上使用用户点击时创建播放器实例。仅在玩家为零或想播放其他轨道时创建。

@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            
      }
}

最新更新