如何在队列播放器的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>) {

    }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...