将 AVPlayerViewController 放在 UIView 中

Place AVPlayerViewController inside UIView

目前我有一个底部有四个控件的对话视图。每个控件都在对话中加载不同的视图。其中一个控件正在对话视图中设置 AVPlayer 并正在播放它。不幸的是 AVPlayer 本身没有播放控件。

AVPlayerViewController 怎么会有回放控制。 可不可以把a AVPlayerViewController 放在a UIView 里面让它不启动作为新屏幕? 我想将它放在我的 UIView 中,这样一切都在我的 dialgoue 中进行。

您可以初始化 AVPlayerViewController 并将其作为子项添加到您的 ViewController 中,并将其作为子视图插入。

[self addChildViewController:yourPlayerViewController];
[self.view addSubview:yourPlayerViewController.view];
[yourPlayerViewController didMoveToParentViewController:self];

并删除它:

[yourPlayerViewController willMoveToParentViewController:nil];
[yourPlayerViewController.view removeFromSuperview];
[yourPlayerViewController removeFromParentViewController];

编辑SWIFT方法: Check here for Swift

SWIFT 4 - 子视图方法

初始方法工作正常,但当我真的只想要一个子视图时,我觉得视图控制器方法看起来很乱。所以,大多数时候我在自定义视图中播放视频(而不是使用整个 AVPlayerViewController)。

我使用此方法在完全填充现有视图的子视图中显示视频。在下面的示例中,urlToVideo 是您要播放的视频的 URL,而 existingView 是我们要播放的视图将我们的新视图放入(作为子视图)。

首先,在新的VideoPlayerView.swift文件中新建一个VideoPlayerViewclass,用这个,就是直接从 Apple's website copy/paste,除了我称它为 VideoPlayerView 而不是 PlayerView.

import Foundation
import UIKit
import AVFoundation

/// A simple `UIView` subclass that is backed by an `AVPlayerLayer` layer.
class VideoPlayerView: UIView {
    var player: AVPlayer? {
        get {
            return playerLayer.player
        }

        set {
            playerLayer.player = newValue
        }
    }

    var playerLayer: AVPlayerLayer {
        return layer as! AVPlayerLayer
    }

    override class var layerClass: AnyClass {
        return AVPlayerLayer.self
    }
}

然后,当我想播放视频时,我创建子视图并播放它:

let player = AVPlayer(url: urlToVideo)

let playerFrame = CGRect(x: 0, y: 0, width: existingView.frame.width, height: existingView.frame.height)
let videoPlayerView = VideoPlayerView(frame: playerFrame)
videoPlayerView.player = player
existingView.addSubview(videoPlayerView)

player.play()

我正在使用 Swift 3.2 / Xcode 9.2 / iOS 11

这是通过 9 个简单步骤完成的方法。每行上方都有步骤说明

**确保您 import AVKit 可以访问 AVPlayerViewController 否则您将无法使用它

// 1. to have access to the AVPlayerViewController import AVKit
import AVKit

 // 2. create your class properties
var videoUrl: URL?
var player: AVPlayer?
let avPVC = AVPlayerViewController()

override func viewDidLoad() {
        super.viewDidLoad()

        // 3. make sure the url your using isn't nil
        guard let videoUrl = self.videoUrl else { return }

        // 4. init an AVPlayer object with the url then set the class property player with the AVPlayer object
        self.player = AVPlayer(url: videoUrl)

        // 5. set the class property player to the AVPlayerViewController's player
        avPVC.player = self.player

        // 6. set the the parent vc's bounds to the AVPlayerViewController's frame
        avPVC.view.frame = self.view.bounds

        // 7. the parent vc has a method on it: addChildViewController() that takes the child you want to add to it (in this case the AVPlayerViewController) as an argument
        self.addChildViewController(avPVC)

        // 8. add the AVPlayerViewController's view as a subview to the parent vc
        self.view.addSubview(avPVC.view)

        // 9. on AVPlayerViewController call didMove(toParentViewController:) and pass the parent vc as an argument to move it inside parent
        avPVC.didMove(toParentViewController: self)

}

我的解决方案是让您的视图像 canvas 并基本上在其上绘制 AVPlayerViewController:

@IBOutlet weak var layerVideoView: UIImageView!
    guard let url = Bundle.main.path(forResource: "santana", ofType: "mp4") else { return debugPrint("video not found") }
    let path = URL(fileURLWithPath: url)
    
    let player = AVPlayer(url: path)
    let playerController = AVPlayerViewController()
    playerController.player = player
    playerController.view.frame = CGRect(x: layerVideoView.frame.origin.x, y: layerVideoView.frame.origin.y, width: layerVideoView.frame.width, height: layerVideoView.frame.height)
    self.addChild(playerController)
    self.view.addSubview(playerController.view)

LayerVideoView 是图像视图,但如果适合,您可以只使用 UIView。 将情节提要中的约束添加到您的视图很重要,因为您的视频播放器将模仿您的视图的形状。