首页 > 解决方案 > 如何以正确的方式在 SwiftUI 中实现 AVPlayer?

问题描述

我在播放器方面遇到了一些问题。我知道有很多播放器示例,但几乎所有播放器示例都设计为仅播放一个 url,并且没有我想要的功能。

首先这是我现有的播放器代码:

struct PlayerViewController: UIViewControllerRepresentable {

    var video: Video

    private let player = AVPlayer()

    func makeUIViewController(context: Context) -> AVPlayerViewController {
        let playerVC = AVPlayerViewController()
        playerVC.player = self.player
        do {
            try AVAudioSession.sharedInstance().setCategory(.playback)
        } catch(let error) {
            print(error.localizedDescription)
        }
        playerVC.player?.play()

        return playerVC
    }

    func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {
        guard let url = URL(string: video.url) else { return }

        resetPlayer(uiViewController)

        let item = AVPlayerItem(url: url)           
        uiViewController.player?.replaceCurrentItem(with: item)
        uiViewController.player?.play()
        if((uiViewController.view.window) == nil)
        {
            uiViewController.player?.pause()
        }
        print("Player::UpdatePlayer: Player updated")
    }

    func resetPlayer(_ vc: AVPlayerViewController) {
        vc.player?.pause()
        vc.player?.replaceCurrentItem(with: nil)
        print("Player::ResetPlayer: Player reseted.!")
    }


}

struct Video: Identifiable, Equatable {
    var id: Int
    var url: String


}

我使用它如下。这只是我在实际项目中用按钮操作替换 str 的示例。

struct TestTestView: View {
    @State var str: String = ""
    var body: some View {
        PlayerViewController(video: Video(id: 2, url: (str == "") ? chan.getDVR()[0].getHlsStreamURL() : self.str ))
    }
}

现在上面的代码可以工作到一定程度。它会播放,您可以通过单击按钮来更新 url,它会播放新的 url。但是当它进入全屏时,视频会停止,因为它会更新整个播放器,尽管没有任何改变。以下几行使其在进入全屏模式时暂停:

        if((uiViewController.view.window) == nil)
        {
            uiViewController.player?.pause()
        }

但是,如果我在导航到另一个屏幕时删除这些行,它会继续播放,你会一直听到声音。我试图检测全屏来更新我的代码,但我无法做到。我试图检测到播放器实际上在屏幕上,但效果不佳。那么实现它的正确方法是什么。基本上我想做:

1 - 能够更新播放器并播放不同的流 2 - 开始自动播放 3 - 切换到全屏模式时平稳地继续播放 4 - 导航到另一个屏幕时停止。

顺便说一句,如果它不是全屏模式,我无法单击播放按钮或进度条,但不知何故我可以单击静音或全屏按钮。我需要帮助!!

标签: iosswiftuiavplayer

解决方案


推荐阅读