如何解决在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)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。