Swift:调整AVPlayerLayer的大小以匹配其父容器的边界

Con*_*rel 6 iphone ios avplayer avplayerlayer swift

我有一个本地视频播放使用AVPlayerAVPlayerLayer(斯威夫特的iOS 8.2),我需要调整AVPlayerLayer(introPlayerLayer当它的父视图() introView)被调整,包括对取向变化.到目前为止,我所尝试过的任何东西似乎都没有用,而且playerLayer它的大小和位置都不对.

AVPlayer设置使用本地MP4视频,并且AVPlayerLayer正在使用该播放器初始化.然后将该图层作为子图层添加到父视图中.

这是我的代码:

func playIntro() {
    let path = NSBundle.mainBundle().pathForResource("intro", ofType: "mp4")
    let url  = NSURL.fileURLWithPath(path!)
    let introPlayer           = AVPlayer(URL: url)
    introPlayer.allowsExternalPlayback = false

    var introPlayerLayer = AVPlayerLayer(player: introPlayer)
    introView.layer.addSublayer(introPlayerLayer)
    introPlayerLayer.frame = introView.bounds

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:", name: AVPlayerItemDidPlayToEndTimeNotification, object: introPlayer.currentItem)

    introView.hidden = false
    introPlayer.play()
}
Run Code Online (Sandbox Code Playgroud)

我应该添加AVPlayerLayer作为子层UIView,或者我应该继承父容器(UIView),如https://developer.apple.com/library/ios/documentation/AudioVideo/的"播放器视图"部分所示Conceptual/AVFoundationPG/Articles/02_Playback.html.如果是这样,我将如何PlayerView在Swift中编写该子类(在Objective-C中显示)?提前感谢您的任何帮助.

Cri*_*oso 10

斯威夫特3.

private func playVideo() {
        guard let path = Bundle.main.path(forResource: "video", ofType:"mp4") else {
            debugPrint("video.m4v not found")
            return
        }
        let player = AVPlayer(url: URL(fileURLWithPath: path))
        var playerLayer: AVPlayerLayer?
        playerLayer = AVPlayerLayer(player: player)
        playerLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
        playerLayer!.frame = self.view.frame
        self.view!.layer.addSublayer(playerLayer!)
        player.play()

    }
Run Code Online (Sandbox Code Playgroud)


Eri*_*ele 5

我想,在我自己的项目中,我能够做你想做的事情。这是没有子类化的。这是我的代码:

override func viewWillLayoutSubviews() {
   previewScene()
}

func previewScene() {
    var firstAsset: AVAsset!, secondAsset: AVAsset!, thirdAsset: AVAsset!


     firstAsset = MediaController.sharedMediaController.s3Shot1
     secondAsset = MediaController.sharedMediaController.s3Shot2
     thirdAsset  = MediaController.sharedMediaController.s3Shot3


    if firstAsset != nil && secondAsset != nil && thirdAsset != nil {
        let assets = [firstAsset, secondAsset, thirdAsset]
        var shots = [AVPlayerItem]()

        for item in assets {
            let shot = AVPlayerItem(asset: item)
            shots.append(shot)
        }

        self.videoPlayer = AVQueuePlayer(items: shots)
        self.playerLayer = AVPlayerLayer(player: self.videoPlayer)
        self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
         AVPlayerItemDidPlayToEndTimeNotification, object: self.videoPlayer.items().last)
        self.videoPreviewLayer.layer.addSublayer(playerLayer)
        self.playerLayer.frame = self.videoPreviewLayer.bounds

    }

}
Run Code Online (Sandbox Code Playgroud)