gpt4 book ai didi

ios - 转至下一个 View Controller 后 AVPlayer 视频仍在播放

转载 作者:搜寻专家 更新时间:2023-10-31 22:01:20 24 4
gpt4 key购买 nike

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

View Controller

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)
}
}

最佳答案

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

NotificationCenter.default.removeObserver(self)

同时将它从 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 {
}
}

并将玩家对象设为全局变量。 var player = AVPlayer? 并在 viewWillDisappear 中将其设为 nil

所以你的 viewWillDisappear 应该是这样的:

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

关于ios - 转至下一个 View Controller 后 AVPlayer 视频仍在播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48738697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com