9

AVPlayerおよびAVPlayerLayer(Swift、iOS 8.2)を使用してローカル ビデオを再生しています。向きの変更を含め、親ビュー ( ) のサイズが変更されたときに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()
}

https://developer.apple.com/library/ios/documentation/AudioVideo/の「The Player View」セクションに示されているように、AVPlayerLayerのサブレイヤーとして を追加するUIViewか、親コンテナー ( ) をサブクラス化する必要があります。 Conceptual/AVFoundationPG/Articles/02_Playback.html . もしそうなら、Swift でそのサブクラス (Objective-C に示されている) をどのように記述しますか? よろしくお願いいたします。UIViewPlayerView

4

3 に答える 3

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 に答える