AVPlayer视频仍然在segue到下一个视图控制器后播放

Kin*_*nja 3 video xcode ios avplayer swift

我现在正在循环我的mp4视频,没有播放控件,有点像gif但有声音.但我不知道为什么当我转到下一个视图控制器时,视频仍在播放.有人知道解决这个问题的最简单方法吗?

视图控制器

import UIKit
import AVKit
import AVFoundation
fileprivate var playerObserver: Any?


class ScoreController: UIViewController {
    @IBOutlet var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()


        let returnValue: Int = UserDefaults.standard.integer(forKey: "userScore")
        label.text = "Your Score: \(returnValue)/30"

        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            let path = Bundle.main.path(forResource: "Innie-Kiss", ofType:"mp4")
            let player = AVPlayer(url: URL(fileURLWithPath: path!))
            let resetPlayer = {
                player.seek(to: kCMTimeZero)
                player.play()
            }
            playerObserver = NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: nil) { notification in resetPlayer() }
            let controller = AVPlayerViewController()
            controller.player = player
            controller.showsPlaybackControls = false
            self.addChildViewController(controller)
            let screenSize = UIScreen.main.bounds.size
            let videoFrame = CGRect(x: 0, y: 130, width: screenSize.width, height: (screenSize.height - 130) / 2)
            controller.view.frame = videoFrame
            self.view.addSubview(controller.view)
            player.play()
        } catch {
        }
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
    }
    fileprivate var player: AVPlayer? {
        didSet { player?.play() }
    }
    deinit {
        guard let observer = playerObserver else { return }
        NotificationCenter.default.removeObserver(observer)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()  
    }
    @IBAction func doneButton(_ sender: Any) {
        self.performSegue(withIdentifier: "done", sender: self)
    }
}
Run Code Online (Sandbox Code Playgroud)

Sha*_*han 7

在viewWillDisapper()或segue的按钮操作中执行以下操作:

NotificationCenter.default.removeObserver(self)
Run Code Online (Sandbox Code Playgroud)

同样将它从viewDidLoad()移动到某些函数,如:

 var player: AVPlayer?

 func audioPlayer(){
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        let path                         = Bundle.main.path(forResource: "Innie-Kiss", ofType:"mp4")
        player                           = AVPlayer(url: URL(fileURLWithPath: path!))
        let resetPlayer                  = {
            self.player?.seek(to: kCMTimeZero)
            self.player?.play()
        }
        playerObserver                   = NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player?.currentItem, queue: nil) { notification in resetPlayer() }
        let controller                   = AVPlayerViewController()
        controller.player                = player
        controller.showsPlaybackControls = false
        self.addChildViewController(controller)
        let screenSize                   = UIScreen.main.bounds.size
        let videoFrame                   = CGRect(x: 0, y: 130, width: screenSize.width, height: (screenSize.height - 130) / 2)
        controller.view.frame            = videoFrame
        self.view.addSubview(controller.view)
        player?.play()
    } catch {
    }
}
Run Code Online (Sandbox Code Playgroud)

并使玩家对象成为全局变量.var player = AVPlayer?viewWillDisappear制作它nil.

所以你的viewWillDisappear应如下所示:

override func viewWillDisappear(_ animated: Bool) {
     NotificationCenter.default.removeObserver(self)
    if player != nil{
        player?.replaceCurrentItem(with: nil)
        player = nil
    }
}
Run Code Online (Sandbox Code Playgroud)