ios - 将 Swift 与 AVPlayer 一起使用,如何通过代码添加和删除视频?

标签 ios swift avfoundation avplayer avplayerlayer

我是 Swift 的新手,正在尝试将视频添加到 View ,然后在发送“stopScreenSaver”通知时将其删除。除了我去删除视频层 (playerLayer.removeFromSuperlayer()) 之外,一切似乎都运行良好。

任何指导将不胜感激。我觉得我在这里缺少一些添加和删除图层的基本概念!

    import UIKit
    import AVFoundation
    import QuartzCore
    import CoreMedia

    class ViewController: UIViewController {

        let contentURL = NSBundle.mainBundle().URLForResource("testvideo", withExtension: "mp4")
        var player = AVPlayer()
        var playerLayer = AVPlayerLayer()
        let screenSize : CGRect = UIScreen.mainScreen().bounds

        override func viewDidLoad() {
            super.viewDidLoad()
            // Used for starting and stopping the videos related to the screen saver
            NSNotificationCenter.defaultCenter().addObserver(self, selector: "playScreenSaver:", name: "playScreenSaverID", object: nil)
            NSNotificationCenter.defaultCenter().addObserver(self, selector: "stopScreenSaver:", name: "stopScreenSaverID", object: nil)
}

        override func viewDidAppear(animated: Bool) {
            // Player
            player = AVPlayer(URL: contentURL!)

            // Layer for display… Video plays at the full size of the iPad
            playerLayer = AVPlayerLayer(player: player)
            var view = UIView(frame: CGRectMake(0, 0, screenSize.width, screenSize.height))
            self.view.layer.addSublayer(playerLayer)
            playerLayer.frame = view.bounds
        }

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


    func playScreenSaver(notification: NSNotification){
            print("play")
            dispatch_async(dispatch_get_main_queue()) {
               self.view.layer.addSublayer(self.playerLayer!)
               self.player!.play()
            }
    }

    func stopScreenSaver(notification: NSNotification){
            print("pause")
            dispatch_async(dispatch_get_main_queue()) {
               self.player!.pause()
               self.playerLayer!.removeFromSuperlayer()
            }
    }

}

最佳答案

使用 dispatch 解决了我遇到的问题。

dispatch_async(dispatch_get_main_queue()) {
    self.player!.pause()
    self.playerLayer!.removeFromSuperlayer()
 }

关于ios - 将 Swift 与 AVPlayer 一起使用,如何通过代码添加和删除视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32726269/

相关文章:

ios - AVAssetExportSession 在输出视频的右侧和底部给我一个绿色边框

ios - 错误代码 :AccessDenied, 消息:AWS 身份验证需要有效的日期或 x-amz-date header

swift - RealityKit – 将 CGPoint 转换为 SIMD<Float>

ios - webView 导致 tableview 滞后

Swift 无法通过 IBAction "Any"连接多个按钮但可以通过 "AnyObject"

swiftui - 显示另一个 swiftUI View 时如何停止相机工作?

ios - 如何为 iPhone 录制过滤后的视频?

ios - 如何在 Swift 中引用导航 Controller ?

cocoa-touch - 有没有办法将 UIView 动画与自定义缓动方程一起使用

ios - audioEngine.start() 调用时抛出异常