gpt4 book ai didi

ios - 包装 AVPlayer 行为时处理 AVPlayerLayer

转载 作者:行者123 更新时间:2023-12-01 16:12:13 25 4
gpt4 key购买 nike

我正在尝试包装 AVPlayer在我自己的类中,因此我可以提供更好的 API 以在整个应用程序中使用,因此我可以模拟玩家行为以测试其他对象(并且因为 AVPlayer KVO 使用起来非常难看!)。这是我尝试仅使用播放和暂停功能的简化模型:

protocol VideoPlayerProtocol {
func play()
func pause()
}

class AVPlayerWrapped: VideoPlayerProtocol {

private let player = AVPlayer()

init(playerItem: AVPlayerItem) {
self.player.replaceCurrentItem(with: playerItem)
}

func play() {
player.play()
}

func pause() {
player.pause()
}
}

我还有一个 PlayerView添加一个 AVPlayerLayer到一个 View 。在 Apple 文档中,这是通过提供 View AVPlayer 来设置的。 :
class PlayerView: UIView {

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

var playerLayer: AVPlayerLayer {
return layer as! AVPlayerLayer
}

var player: AVPlayer? {
get { playerLayer.player }
set { playerLayer.player = newValue }
}
}

问题是当我设置 AVPlayerWrapped对象,为了在 View 中显示回放,我需要显示底层 AVPlayerplayer位于 PlayerView 的房产这违背了我包裹玩家的目的。

有没有办法让我以某种方式使用 AVPlayerLayer没有我的 AVPlayerWrapped必须透露它的潜在玩家吗?还是我采取了错误的方法?

非常感谢任何指导!

最佳答案

class AVPlayerWrapped: VideoPlayerProtocol {

fileprivate let player = AVPlayer()

init(playerItem: AVPlayerItem) {
self.player.replaceCurrentItem(with: playerItem)
}

func play() {
player.play()
}

func pause() {
player.pause()
}
}

extension AVPlayerLayer {
func setPlayerWrapper(_ playerWrapped: AVPlayerWrapped) {
player = playerWrapped.player
}
}


class PlayerView: UIView {

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

var playerLayer: AVPlayerLayer {
return layer as! AVPlayerLayer
}

func setPlayerWrapper(_ playerWrapped: AVPlayerWrapped) {
playerLayer.setPlayerWrapper(playerWrapped)
}
}

我相信您的 View 不需要 setter/getter -在我的实践中我没有使用它。但是如果你这样做了,你可以用一个关联对象来做,但它比一个真实的属性要慢得多,我建议你只在特殊情况下使用这种方法。

关于ios - 包装 AVPlayer 行为时处理 AVPlayerLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62020735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com