9

我有一个使用AVPlayerand (Swift, iOS 8.2) 播放的本地视频,当它的父视图 ( ) 调整大小时AVPlayerLayer,我需要调整AVPlayerLayer( ) 的大小,包括方向更改。到目前为止,我尝试过的任何方法似乎都不起作用,并且尺寸和位置错误。introPlayerLayerintroViewplayerLayer

使用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()
}

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

4

3 回答 3

12

斯威夫特 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()

    }
于 2017-06-09T00:20:43.810 回答
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

    }

}
于 2015-11-14T21:23:41.990 回答
3
introView.layer.masksToBounds = true

也可能有帮助

于 2016-06-09T15:20:49.710 回答