 
     private func removeObservers() {
         guard let player = player, player.observationInfo != nil else { return }
-        player.removeObserver(self, forKeyPath: "currentItem.playbackLikelyToKeepUp")
-        player.removeObserver(self, forKeyPath: "currentItem.playbackBufferEmpty")
         if let timeObserver = timeObserver {
             player.removeTimeObserver(timeObserver)
         }

            player.observe(\.currentItem?.status, options: .new, changeHandler: handleStatusChangedEvent),
            player.observe(\.currentItem?.loadedTimeRanges, options: .new, changeHandler: handleLoadedTimeRangesEvent),
            player.observe(\.currentItem?.seekableTimeRanges, options: .new, changeHandler: handleSeekableTimeRangesEvent),
            player.observe(\.isExternalPlaybackActive, options: .new, changeHandler: handleExternalPlaybackActiveEvent),
            player.observe(\.rate, options: .new, changeHandler: handlePlayerRateChanged),
        ]

        player.addObserver(self, forKeyPath: "currentItem.playbackLikelyToKeepUp",
                            options: .new, context: &kvoBufferingContext)
        player.addObserver(self, forKeyPath: "currentItem.playbackBufferEmpty",
                            options: .new, context: &kvoBufferingContext)

        NotificationCenter.default.addObserver(
            self,
            selector: #selector(AVFoundationPlayback.playbackDidEnd),
            name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
            object: player.currentItem)
    }

    private func maximizePlayer(view: UIView, changes: NSKeyValueObservedChange<CGRect>) {


    open override func mute(_ enabled: Bool) {
        player?.volume = enabled ? .zero : 1.0
    }

    private func updateState(_ newState: PlaybackState) {
