Ios Swift 4&;代码10。在应用程序启动时播放视频,完成后显示view controller

Ios Swift 4&;代码10。在应用程序启动时播放视频,完成后显示view controller,ios,swift4,xcode10,Ios,Swift4,Xcode10,首先,我对Xcode 10和Swift 4完全陌生,我在这里搜索过,但还没有找到有效的代码 我想要的是: 在启动应用程序时播放本地存储的视频(称为“launchvideo”)。 视频完成后,显示/移动到脚本ID为“菜单”的UIviewcontroller 到目前为止,我有我的主导航控制器和它的链接视图控制器。 我想我需要一个UIview来保存要在此页面上播放的视频 有没有人可以帮助一个新人? 谢谢您必须在launchvideoVC上加载一个视频,如swift 4及更高版本中的以下方式 impo

首先,我对Xcode 10和Swift 4完全陌生,我在这里搜索过,但还没有找到有效的代码

我想要的是: 在启动应用程序时播放本地存储的视频(称为“launchvideo”)。 视频完成后,显示/移动到脚本ID为“菜单”的UIviewcontroller

到目前为止,我有我的主导航控制器和它的链接视图控制器。 我想我需要一个UIview来保存要在此页面上播放的视频

有没有人可以帮助一个新人?
谢谢

您必须在launchvideoVC上加载一个视频,如swift 4及更高版本中的以下方式

 import AVFoundation
 import AVKit

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    initVideo()
 }

func initVideo(){
    do {
            try AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default)
            try AVAudioSession.sharedInstance().setActive(true)
    } catch {
        print(error)
    }

    let path = Bundle.main.path(forResource: "yourlocalvideo", ofType:"mp4");
    player = AVPlayer(url: NSURL(fileURLWithPath: path!) as URL)
    NotificationCenter.default.addObserver(self, selector: #selector(launchvideoVC.itemDidFinishPlaying(_:)), name: .AVPlayerItemDidPlayToEndTime, object: player?.currentItem)
    DispatchQueue.main.async(execute: {() -> Void in
        let playerLayer = AVPlayerLayer(player: self.player)
        playerLayer.frame = self.view.bounds
        playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
        playerLayer.zPosition = 1
        self.view.layer.addSublayer(playerLayer)
        self.player?.seek(to: CMTime.zero)
        self.player?.play()

    })
}

@objc func itemDidFinishPlaying(_ notification: Notification?) {
   //move to whatever UIViewcontroller with a storyboard ID of "menu"
}
我想这可能对你有帮助。
快乐编码:)

首先将启动屏幕情节提要从“常规”选项卡中的“项目设置”更改为“主情节提要”

创建一个具有以下名称的视图控制器,并编写代码以实现AVPlayer来播放视频

import UIKit
import AVFoundation

class VideoLaunchVC: UIViewController {

    func setupAVPlayer() {

        let videoURL = Bundle.main.url(forResource: "Video", withExtension: "mov") // 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: "ViewController") as! ViewController
                self?.navigationController?.pushViewController(vc, animated: true)
            }
        }
    }

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

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

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

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

项目启动屏幕文件:

另请参见以下视频:


首先,使用view创建一个新的视图控制器,并将启动屏幕情节提要从“常规”选项卡中的“项目设置”更改为“主情节提要”

并将您的视频添加到文件夹中

然后只需将我的以下代码添加到您的launch screenView控制器:

import UIKit

import MediaPlayer

import AVKit

class LaunchViewController: UIViewController {

    fileprivate var rootViewController: UIViewController? = nil

    var player: AVPlayer?

    var playerController = AVPlayerViewController()

    override func viewDidLoad() {

        super.viewDidLoad()

        showSplashViewController()



        // Do any additional setup after loading the view.

    }



    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

    func playVideo() {

        let videoURL = NSURL(string: "videoplayback")

        player = AVPlayer(url: videoURL! as URL)

        let playerController = AVPlayerViewController()

        playerController.player = player

        self.addChildViewController(playerController)



        // Add your view Frame

        playerController.view.frame = self.view.frame



        // Add subview in your view

        self.view.addSubview(playerController.view)



        player?.play()

    }

    private func loadVideo() {



        //this line is important to prevent background music stop

        do {

            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

        } catch { }



        let path = Bundle.main.path(forResource: "videoplayback", ofType:"mp4")



        let filePathURL = NSURL.fileURL(withPath: path!)

        let player = AVPlayer(url: filePathURL)

        let playerLayer = AVPlayerLayer(player: player)



        playerLayer.frame = self.view.frame

        playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill

        playerLayer.zPosition = -1



        self.view.layer.addSublayer(playerLayer)





        player.seek(to: kCMTimeZero)

        player.play()

    }



    func showSplashViewControllerNoPing() {



        if rootViewController is LaunchViewController {

            return

        }



        loadVideo()

    }



    /// Simulates an API handshake success and transitions to MapViewController

    func showSplashViewController() {

        showSplashViewControllerNoPing()



        delay(6.00) {

            self.showMenuNavigationViewController()

        }

    }



    public func delay(_ delay:Double, closure:@escaping ()->()) {

        DispatchQueue.main.asyncAfter(

            deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)

    }



    /// Displays the MapViewController

    func showMenuNavigationViewController() {

        guard !(rootViewController is Home) else { return }



        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        let nav =  storyboard.instantiateViewController(withIdentifier: "homeTab") as! Home

        nav.willMove(toParentViewController: self)

        addChildViewController(nav)

        if let rootViewController = self.rootViewController {

            self.rootViewController = nav

            rootViewController.willMove(toParentViewController: nil)



            transition(from: rootViewController, to: nav, duration: 0.55, options: [.transitionCrossDissolve, .curveEaseOut], animations: { () -> Void in



            }, completion: { _ in

                nav.didMove(toParentViewController: self)

                rootViewController.removeFromParentViewController()

                rootViewController.didMove(toParentViewController: nil)

            })

        } else {

            rootViewController = nav

            view.addSubview(nav.view)

            nav.didMove(toParentViewController: self)

        }





    }



    override var prefersStatusBarHidden : Bool {

        switch rootViewController  {

        case is LaunchViewController:

            return true

        case is Home:

            return false

        default:

            return false

        }

    }



}

如果你的意思是启动屏幕,那么你不能把视频放在那里。是吗?如果您想在启动屏幕结束后立即播放视频,然后尝试搜索
AVPlayerLayer
,这样就可以播放不在启动屏幕上的视频了。我知道你不能在那里放视频。在应用程序加载之前,这将有一个静态图像。@Astro,正如Tj3n所建议的,在加载所有UI元素后,您需要在UIViewController中播放launchVideo,可能是在ViewDidAspect委托方法中。请看一看,我一定还是做错了什么。我在这一行中得到了一个构建错误:“let vc=UIStoryboard(name:“Main”,bundle:nil)。。。我给它起的名字不对吗?这只是你问题的解决办法。您必须使用视图控制器和标识符,这些控制器和标识符用于相同的目的。向我展示你的带有标识符和视图控制器的情节提要。我已经在下面发布了情节提要,你可以打包你的文件并提供给我使用吗?这将帮助我再次学习tooHi@sagar,你能进一步帮助我吗?我尝试了这段代码,但它有超过13个错误,无法构建。不知道为什么