AVPlayer不断添加流而不是替换

问题描述 投票:1回答:1

我正在通过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
}

}

这是在我的viewcontroller中。它首先从我的服务器获取可能广告的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!)
}
ios swift avplayer
1个回答
0
投票

删除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!)
}
© www.soinside.com 2019 - 2024. All rights reserved.