微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在队列播放器的currentItem上设置观察者?

如何解决如何在队列播放器的currentItem上设置观察者?

我正在尝试为currentItem中的AVQueueplayer设置观察者,但是遇到一个错误,称为EXC_BAD_ACCESS。有人能帮助我吗?感谢您的关注。我期待着您的回复。这是我的代码

struct VideoPlayerS : UIViewControllerRepresentable {
        
var work : WorkoutDeS
@Binding var player : AVQueuePlayer
var playerLayer = AVPlayerLayer()
    
public func makeUIViewController(context: Context) -> AVPlayerViewController {
    let items = [
        
        AVPlayerItem(url: URL(fileURLWithPath: String(work.url1))),AVPlayerItem(url: URL(fileURLWithPath: String(work.url2)))
        
    ]
   let player = AVQueuePlayer(items: items)
       let controller = AVPlayerViewController()

       dispatchQueue.main.async {
          self.player = player
       }
    controller.player = player
    controller.videoGravity = .resizeAspectFill

    
    

    
    player.actionAtItemEnd = .none
    NotificationCenter.default.addobserver(forName: .AVPlayerItemDidplayToEndTime,object: self.player.currentItem,queue: .main) { _ in
        self.player.seek(to: CMTime.zero)
        self.player.play()
    }
    player.play()
    
    
    player.currentItem?.addobserver(AVQueuePlayer(),forKeyPath: "status",options: NSkeyvalueObservingOptions(),context: nil)
    
   
    func observeValue(forKeyPath keyPath: String?,of object: Any?,change: [NSkeyvalueChangeKey : Any]?,context: UnsafeMutableRawPointer?) {
       
           
           
       if keyPath == "status" {
           print("Hello")
            
               player.currentItem?.removeObserver(AVQueuePlayer(),forKeyPath: "status")
           
       
       }
       }

    
    return controller
}






func rewindVideo(notification: Notification) {
    playerLayer.player?.seek(to: .zero)
}

public func updateUIViewController(_ uiViewController: AVPlayerViewController,context: UIViewControllerRepresentableContext<VideoPlayerS>) {
      
}
}

解决方法

Representable是struct,不能用于KVO观察器。您可以使用Coordinator作为观察者。

以下是使用可能的方法修改的代码:

struct VideoPlayerS : UIViewControllerRepresentable {

    var work : WorkoutDeS
    @Binding var player : AVQueuePlayer
    var playerLayer = AVPlayerLayer()

    public func makeUIViewController(context: Context) -> AVPlayerViewController {
        let items = [

            AVPlayerItem(url: URL(fileURLWithPath: String(work.url1))),AVPlayerItem(url: URL(fileURLWithPath: String(work.url2)))

        ]
        let player = AVQueuePlayer(items: items)
        let controller = AVPlayerViewController()

        DispatchQueue.main.async {
            self.player = player
        }
        controller.player = player
        controller.videoGravity = .resizeAspectFill

        player.actionAtItemEnd = .none
        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime,object: self.player.currentItem,queue: .main) { _ in
            self.player.seek(to: CMTime.zero)
            self.player.play()
        }

        player.currentItem?.addObserver(context.coordinator,forKeyPath: "status",options: [.new],context: nil)

        player.play()
        return controller
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(owner: self)
    }

    class Coordinator: NSObject {
        var owner : VideoPlayerS

        init(owner: VideoPlayerS) {
            self.owner = owner
        }

        override func observeValue(forKeyPath keyPath: String?,of object: Any?,change: [NSKeyValueChangeKey : Any]?,context: UnsafeMutableRawPointer?) {
            guard let item = object as? AVPlayerItem else { return }

            if keyPath == "status" {
                print("Hello")
                item.removeObserver(self,forKeyPath: "status")
            }
        }
    }

    func rewindVideo(notification: Notification) {
        playerLayer.player?.seek(to: .zero)
    }

    public func updateUIViewController(_ uiViewController: AVPlayerViewController,context: UIViewControllerRepresentableContext<VideoPlayerS>) {

    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。