http://swiftdeveloperblog.com/code-examples/avplayer-add-periodic-timeobserver-to-update-music-playback-slider/
In this Swift code example we will learn how to make the music playback slider smoothly move as music continues to play, so that user is visually aware how much of music file has been already played and how much is left to play.
Create AVPlayer and AVPlayerItem
Create UIButton programmatically
Create AVPlayerLayer and add it as subview
Handle Play Button action to Pause and Play music
Add UISlider as subview
Handle UISlider value changed event
Determine music file duration in seconds
Set UISlider maximumValue equal to music file duration in seconds
Add addPeriodicTimeObserverForInterval to AVPlayer
AVPlayer. addPeriodicTimeObserverForInterval example in Swift.
player!.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: DispatchQueue.main) { (CMTime) -> Void in
if self.player!.currentItem?.status == .readyToPlay {
let time : Float64 = CMTimeGetSeconds(self.player!.currentTime());
self.playbackSlider!.value = Float ( time );
}
}
AVPlayer with addPeriodicTimeObserverForInterval. Complete example.
import UIKit
import AVFoundation
class ViewController: UIViewController {
var player:AVPlayer?
var playerItem:AVPlayerItem?
var playButton:UIButton?
var playbackSlider:UISlider?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let url = URL(string: "https://s3.amazonaws.com/kargopolov/kukushka.mp3")
let playerItem:AVPlayerItem = AVPlayerItem(url: url!)
player = AVPlayer(playerItem: playerItem)
let playerLayer=AVPlayerLayer(player: player!)
playerLayer.frame=CGRect(x: 0, y: 0, width: 10, height: 50)
self.view.layer.addSublayer(playerLayer)
playButton = UIButton(type: UIButtonType.system) as UIButton
let xPostion:CGFloat = 50
let yPostion:CGFloat = 100
let buttonWidth:CGFloat = 150
let buttonHeight:CGFloat = 45
playButton!.frame = CGRect(x: xPostion, y: yPostion, width: buttonWidth, height: buttonHeight)
playButton!.backgroundColor = UIColor.lightGray
playButton!.setTitle("Play", for: UIControlState.normal)
playButton!.tintColor = UIColor.black
//playButton!.addTarget(self, action: "playButtonTapped:", forControlEvents: .TouchUpInside)
playButton!.addTarget(self, action: #selector(ViewController.playButtonTapped(_:)), for: .touchUpInside)
self.view.addSubview(playButton!)
// Add playback slider
playbackSlider = UISlider(frame:CGRect(x: 10, y: 300, width: 300, height: 20))
playbackSlider!.minimumValue = 0
let duration : CMTime = playerItem.asset.duration
let seconds : Float64 = CMTimeGetSeconds(duration)
playbackSlider!.maximumValue = Float(seconds)
playbackSlider!.isContinuous = false
playbackSlider!.tintColor = UIColor.green
playbackSlider?.addTarget(self, action: #selector(ViewController.playbackSliderValueChanged(_:)), for: .valueChanged)
//playbackSlider!.addTarget(self, action: "playbackSliderValueChanged:", for: .valueChanged)
self.view.addSubview(playbackSlider!)
player!.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: DispatchQueue.main) { (CMTime) -> Void in
if self.player!.currentItem?.status == .readyToPlay {
let time : Float64 = CMTimeGetSeconds(self.player!.currentTime());
self.playbackSlider!.value = Float ( time );
}
}
}
func playbackSliderValueChanged(_ playbackSlider:UISlider)
{
let seconds : Int64 = Int64(playbackSlider.value)
let targetTime:CMTime = CMTimeMake(seconds, 1)
player!.seek(to: targetTime)
if player!.rate == 0
{
player?.play()
}
}
func playButtonTapped(_ sender:UIButton)
{
if player?.rate == 0
{
player!.play()
//playButton!.setImage(UIImage(named: "player_control_pause_50px.png"), forState: UIControlState.Normal)
playButton!.setTitle("Pause", for: UIControlState.normal)
} else {
player!.pause()
//playButton!.setImage(UIImage(named: "player_control_play_50px.png"), forState: UIControlState.Normal)
playButton!.setTitle("Play", for: UIControlState.normal)
}
}
}
Play MP3 Music File From a Remote URL Video Tutorial
Watch this video tutorial to learn how to make a simple AVPlayer and play MP3 music file using Xcode storyboard.