在ViewController中调用自动播放的视频的Controller

问题描述

我已经对其进行了设置,以便在显示ViewController时,视频会自动开始播放,最后它会切换到其他ViewController。

问题是,如果在查看应用程序时将其置于后台,则视频会冻结,您必须重新启动应用程序。

我考虑过将经典的暂停/播放控制器设置为在您按下屏幕时出现,以便您可以继续观看,但是我不知道该怎么做。

还是您有另一种解决方案来防止视频冻结?

import UIKit
import AVKit
import AVFoundation

class View8BaController: UIViewController {

    func setupAVPlayer() {

        let videoURL = Bundle.main.url(forResource: "8B-A",withExtension: "mp4") // Get video url
        let avAssets = AVAsset(url: videoURL!) // Create assets to get duration of video.
        let avPlayer = AVPlayer(url: videoURL!) // Create avPlayer instance
        let avPlayerLayer = AVPlayerLayer(player: avPlayer) // Create avPlayerLayer instance
        avPlayerLayer.frame = self.view.bounds // Set bounds of avPlayerLayer
        self.view.layer.addSublayer(avPlayerLayer) // Add avPlayerLayer to view's layer.
        
        avPlayer.play() // Play video

        // Add observer for every second to check video completed or not,// If video play is completed then redirect to desire view controller.
        avPlayer.addPeriodicTimeObserver(forInterval: CMTime(seconds: 1,preferredTimescale: 1),queue: .main) { [weak self] time in

            if time == avAssets.duration {
                let vc = UIStoryboard(name: "Main",bundle: nil).instantiateViewController(withIdentifier: "SCENA7") as! SCENA7ViewController
                self?.navigationController?.pushViewController(vc,animated: false)
            }
        }
    }

    //------------------------------------------------------------------------------

    override func viewDidLoad() {
        super.viewDidLoad()
        
        
    }

    //------------------------------------------------------------------------------

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.setupAVPlayer()  // Call method to setup AVPlayer & AVPlayerLayer to play video
    }
}

解决方法

您是否尝试过让视频在sceneDelegate中播放?

添加到类的上方,在func setupAVPlayer()上方,

var avPlayer: AvPlayer!

然后在您的场景中删除所有功能之外的

let view8Ba = View8BaController()

创建视图控制器的实例。然后,您可以访问以下属性:

func sceneWillEnterForeground(_ scene: UIScene) {
    if view8Ba.viewIfLoaded?.window != nil {
     view8Ba.avPlayer.play()
    }
 }

当应用从后台返回时,这将告诉您的视频再次开始播放。

如果要在点击屏幕时添加播放/暂停,则可以向当前视图控制器添加点击手势识别器和另一个视图,并将背景设置为清除(在情节提要中将新视图拖动到屏幕上的白条上)视图控制器顶部)

然后打电话

   override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        pauseScreenView.frame = View8BaController.bounds
    }

这告诉您添加的新视图在viewController上的位置。

在轻击手势识别器的IBAction中

@IBAction func screenTapped(_ sender: Any) {

View8BaController.addSubview(pauseScreenView)
DispatchQueue.main.asyncAfter(deadline: .now() + 10.0) {
    self.pauseScreenView.removeFromSuperview()
    }
}

这会将新视图添加到viewController的顶部,然后在10秒后将其删除。

在该新视图中,您可以添加一个按钮,该按钮将播放/暂停视频

@IBAction func pauseVideo(_ sender: UIButton) {
    if avPlayer.timeControlStatus == .playing {
        avPlayer.pause()
        pauseButton.setImage(playImage,for: .normal)
    }else {
        avPlayer.play()
        pauseButton.setImage(pauseImage,for: .normal)
    }
}