Skip to main content

Listening to Player Events

Attach listeners​

You can listen to events such as changes in player state, buffering state, seek state, and playback errors by registering a listener or delegate.

// self must conform to `PlayerDelegate` protocol
player.delegate = self;

Attach multiple listeners​

You can attach multiple listeners to the player to receive callbacks. The following code snippet demonstrates this:

// delegateObject must conform to `PlayerDelegate` protocol
player.addDelegate(delegateObject);

You can remove the added delegate object as follows:

// remove the added delegate
player.removeDelegate(delegateObject);

Observe player state changes​

Receive changes in player state by implementing the following method in a registered listener or delegate:

func playerStateDidChange(state: PlayerState) {

}

The player also provides observable properties. You can observe the playbackState, isSeeking, and isBuffering properties for state changes.

// Observe player playbackState property
player.playbackState.add(self) { (oldValue, newValue) in
// Handle state change
}

// Remove observers when you close the player or release the player instance
player.playbackState.remove(self)

The player can be in one of the following playback states:

  • PlaybackState.IDLE: The initial state. Indicates that the player has no media to play and doesn't hold any resources.
  • PlaybackState.LOADING: Indicates that the player is loading the initial media chunks (manifest, initialization chunks, and so on) required to play the media source.
  • PlaybackState.LOADED: Indicates that the player has loaded all the resources needed to start playback rendering.
  • PlaybackState.STARTED: Indicates that the player has started rendering playback.
  • PlaybackState.PAUSED: Indicates that the player has paused rendering playback.
  • PlaybackState.STOPPING: Indicates that the player is stopping playback rendering.

Player State Machine

Observing the Playback Time​

Observe the playback time for an asset in order to update the player’s state.

 var timeObserverToken: Any?
func addPeriodicTimeObserver() {
// Notify every half second
let timeScale = CMTimeScale(NSEC_PER_SEC)
let time = CMTime(seconds: 0.5,
preferredTimescale: timeScale)
timeObserverToken = player?.addPeriodicTimeObserver(
forInterval: time,
queue: .main) {
[weak self] time in
guard let self = self else { return }
// Update your custom player UI
}
}
func removePeriodicTimeObserver() {
if let timeObserverToken = timeObserverToken,
let player = player {
player.removeTimeObserver(timeObserverToken)
self.timeObserverToken = nil
}
}

Note: Add and remove time observers when pausing, seeking, and stopping to avoid unnecessary updates.

Handle player errors​

Observe playback failures by implementing the following method in a registered listener or delegate:

func playerDidFail(with error: FLError) {

}

Note: For a full list of possible error codes, see Error codes.