将 AVPlayerViewController 放在 UIView 中

Posted

技术标签:

【中文标题】将 AVPlayerViewController 放在 UIView 中【英文标题】:Place AVPlayerViewController inside UIView 【发布时间】:2017-02-01 11:03:43 【问题描述】:

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

AVPlayerViewController 有播放控件。 是否可以将一个 AVPlayerViewController 放在一个 UIView 这样它就不会作为新屏幕启动?我想要将它放在我的UIView 中,以便一切都在我的拨号盘中进行。

【问题讨论】:

【参考方案1】:

您可以初始化 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

【讨论】:

【参考方案2】:

我正在使用 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)


【讨论】:

【参考方案3】:

SWIFT 4 - 子视图方法

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

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

首先,在一个新的 VideoPlayerView.swift 文件中创建一个 VideoPlayerView 类,使用这个,直接从Apple's website 复制/粘贴,除了我叫它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()

【讨论】:

【参考方案4】:

我的解决方案是让您的视图像画布一样,基本上在其上绘制 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。 将 Storyboard 中的约束添加到您的视图中很重要,因为您的视频播放器将模仿您的视图的形状。

【讨论】:

以上是关于将 AVPlayerViewController 放在 UIView 中的主要内容,如果未能解决你的问题,请参考以下文章

Swift/AppleTV4:如何将 AVPlayer 功能连接到 AVPlayerViewController?

将 AVPlayerViewController.player 设置为 nil 会中断隐藏式字幕

iOS 8 - 关闭全屏 AVPlayerViewController 时将方向更改回纵向

tvOS 中的 AVPlayerViewController 下拉菜单

在 AVPlayerViewController 全屏视图上呈现 UIView

更改 AVPlayerViewController 的播放控制按钮的颜色