UISlider 不能与 AVPlayer 一起正常工作
UISlider does not work correctly with 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)
}
when you click the stop the audio is played again
为了切换播放和暂停,请检查 avplayer 是否已经在播放。如果播放暂停,否则播放。
if player.rate == 0 {
player.play()
//change your button image
}
else {
player.pause()
//change your button image
}
the slider should move as a progress view
您可以使用 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:
不要在用户每次点击按钮时都创建播放器实例。仅在 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
}
}
我用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)
}
when you click the stop the audio is played again
为了切换播放和暂停,请检查 avplayer 是否已经在播放。如果播放暂停,否则播放。
if player.rate == 0 {
player.play()
//change your button image
}
else {
player.pause()
//change your button image
}
the slider should move as a progress view
您可以使用 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:
不要在用户每次点击按钮时都创建播放器实例。仅在 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
}
}