Ios UISlider不能与AVPlayer一起正常工作

Ios UISlider不能与AVPlayer一起正常工作,ios,swift,audio,avplayer,uislider,Ios,Swift,Audio,Avplayer,Uislider,我使用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; pla

我使用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)

}
当您单击停止按钮时,音频将再次播放

@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的PeriodicTime Observer更新滑块进度

    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            
      }
}
当您单击停止按钮时,音频将再次播放

@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的PeriodicTime Observer更新滑块进度

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

为此,您必须在停止时和单击播放后获得时间,然后从该时间开始;或者您必须在停止时和单击播放后获得时间,然后从该时间开始当我按停止时和播放后音频重新播放,并且滑块不能切换到我想要的点@Vasya2014:您可以稍微具体一点吗你的要求?我不明白你在说什么当音频停止播放继续播放时,音频会重新播放,使用滑块时,问题是当音频停止播放继续播放时,无法切换到歌曲的任何部分:这是什么意思?你是想告诉我你想知道一种方法来寻找音频的特定持续时间吗?我想学习如何使声音在我按下“停止”键时继续播放,播放后音频重新播放,滑块不能切换到我想要的点@Vasya2014:你能更具体一点吗你的要求?我不明白你在说什么当音频停止播放继续播放时,音频会重新播放,使用滑块时,问题是当音频停止播放继续播放时,无法切换到歌曲的任何部分:这是什么意思?你是想告诉我你想知道一种方法来寻找音频的特定持续时间吗?我想学习如何使声音在举行的地方继续播放