UISlider 不能与 AVPlayer 一起正常工作

Posted

技术标签:

【中文标题】UISlider 不能与 AVPlayer 一起正常工作【英文标题】:UISlider does not work correctly with AVPlayer 【发布时间】:2017-06-02 09:14:28 【问题描述】:

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


【问题讨论】:

因为你必须在停止时获得时间,然后点击播放后从那个时间开始 【参考方案1】:

当你点击停止时,音频再次播放

为了切换播放和暂停检查 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)
    

附注:

不要在每次用户点击按钮时创建播放器实例。仅当 player 为 nil 或您想播放不同的曲目时创建。

@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 : 你能更具体一点你的要求吗?我没听懂你在说什么 当音频停止并继续播放时,音频重新播放,使用滑块的问题是无法切换到歌曲的任何部分 当音频停止而播放继续时:这是什么意思?想告诉我你想知道一种方法来寻找音频的特定持续时间吗? 我想学习如何制作,让声音在原地继续播放

以上是关于UISlider 不能与 AVPlayer 一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章

UISlider 的 Avplayer 问题

具有缓冲进度的 UISlider - AVPlayer

为 AVPlayer 更新时 UISlider 跳转

AVPlayer seekToTime 不正确使用 UISlider

Objective-c,AVPlayer 中的 UISlider 无法正常工作,在洗涤器之后

UISlider Swift 的 AVPlayer 进度