AVPlayer продолжает добавлять потоки вместо замены

Я запускаю воспроизведение видео с URL-адреса. Это всего лишь кнопка, открывающая полноэкранный режим AVPlayerController. Если люди его закроют, они смогут вернуться к другому элементу, возможно, с видео. Там они могут щелкнуть это видео, чтобы начать, однако, когда они это сделают, я могу слышать звук предыдущего проигрывателя, другого VC, играющего вместе с этим. Это продолжает наслоиться. Как мне этого избежать?

Это мой класс для видеоплеера

import UIKit
import AVFoundation
import AVKit

class simpleVideoPlayer: UIViewController {

var playerController = AVPlayerViewController()
var player:AVPlayer?
var inputVideoUrl: String? = nil

func setupVideo() {

    self.player = AVPlayer()
    self.playerController.player = self.player

}

func playNext(url: URL) {

    let playerItem = AVPlayerItem.init(url: url)
    self.playerController.player?.replaceCurrentItem(with: playerItem)
    self.playerController.player?.play()
}

func setupVideoUrl(url: String) {
    inputVideoUrl = url
}

}

Это в моем представлении. Сначала он получает URL-адрес возможной рекламы с моего сервера, если это не удалось, то он просто загрузит видео "по умолчанию".

let SimpleVideo = simpleVideoPlayer()

@objc func handleTap(gestureRecognizer: UIGestureRecognizer)
{

    ApiVideoAdvertService.sharedInstance.fetchVideoAdvert { (completion: VideoAdvert) in

        let advertUrl = URL(string: completion.video_adverts_url)
        var url = URL(string: (self.article?.video_link?.files[0].link_secure)!)
        var showAdvert: Bool = false

        if (advertUrl != nil && UIApplication.shared.canOpenURL(advertUrl!)) {
            url = advertUrl
            showAdvert = true
        }


        let appDelegate = UIApplication.shared.delegate as! AppDelegate

        if (showAdvert) {
            NotificationCenter.default.addObserver(self, selector: #selector(self.finishVideo),
                                                       name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.SimpleVideo.playerController.player?.currentItem)
        }


        appDelegate.window?.rootViewController?.present(self.SimpleVideo.playerController, animated: true, completion: {
            self.SimpleVideo.setupVideo()

            if (showAdvert) {
                self.SimpleVideo.playerController.setValue(true, forKey: "requiresLinearPlayback")
            }

            self.SimpleVideo.playNext(url: url!)
        })

    }

@objc func finishVideo() {

    let url = URL(string: (article?.video_link?.files[0].link_secure)!)
    SimpleVideo.playerController.setValue(false, forKey: "requiresLinearPlayback")
    SimpleVideo.playNext(url: url!)
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
46
1

Ответы 1

Удаление наблюдателя внутри finishVideo сделало это.

@objc func finishVideo() {

    NotificationCenter.default.removeObserver(self)
    let url = URL(string: (article?.video_link?.files[0].link_secure)!)
    SimpleVideo.playerController.setValue(false, forKey: "requiresLinearPlayback")
    SimpleVideo.playNext(url: url!)
}

Другие вопросы по теме