AVPlayer class 用于多视图控制器

AVPlayer class to be used for Multiple View Controllers

我正在使用 AVPlayer 项目播放直播流(Radio App)。一切似乎都在工作,但是,整个代码都在一个视图控制器下,即 PlayerViewController : UIViewController. 因为我将向应用程序添加更多功能并且不想重复用于 AVPlayer 的所有方法。我如何使用所有必需的方法为 AVPlayer 创建一个 Swift Class 并在我的应用程序的多个页面(未来的视图控制器)上继续使用该 class 实例?

这是加载到 ViewDid Load() 的代码。 Remote Commands 之类的功能稍后将添加到其中。我不想为执行相同任务的单独视图控制器重复代码。

   func configurePlayer(){
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
            print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)
                print("AVAudioSession is Active")

            } catch let error as NSError {
                print(error.localizedDescription)
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        guard let url = URL(string: station!.url!) else {return}
        let playerItem = AVPlayerItem(url: url)
        player = AVPlayer(playerItem: playerItem)  

    }
 

此class的一些其他方法将是

func togglePlayer() {
    if player?.rate != 0 {
        player?.pause()
        self.playButton.setBackgroundImage(UIImage(systemName: "play.circle"), for: .normal)
    } else {
        player?.play()
        self.playButton.setBackgroundImage(UIImage(systemName: "stop"), for: .normal)
    }
}

//Method 1{...}
//Method 2 {...}

您不需要 class 从 AVPlayer 继承,因为您可能不会使用 所有 它必须提供的功能,所以只需创建一个普通的 class.

此外,这会因您的用例或实施而有很大差异,因此我将只提供一个示例供您试验。

class UniversalAVPlayer {
    
    var player: AVPlayer?
    
    init(url: URL?) {
        configurePlayer(url: url)
        allFeatureConfigs()
    }
    
    func configurePlayer(url: URL?) {
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
            print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)
                print("AVAudioSession is Active")
                
            } catch let error as NSError {
                print(error.localizedDescription)
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        guard let url = url else {return}
        let playerItem = AVPlayerItem(url: url)
        player = AVPlayer(playerItem: playerItem)
        
    }
    
    func allFeatureConfigs() {
        //add any configurations you want to add in the future here.
    }
    
}

并且您应该创建一个委托来帮助您使用像您的 togglePlayer 方法这样的方法:

func togglePlayer() {
    if player?.rate != 0 {
        player?.pause()
        self.delegate?.changeImageForPlayStatus(image : UIImage(systemName: "play.circle"))
    } else {
        player?.play()
        self.delegate?.changeImageForPlayStatus(image: UIImage(systemName: "stop"))
    }
}

例如,当使用它提供给您的图像调用委托方法时,更改您 VC 中的背景图像。

由于您不会将这些函数设置为私有,因此您将能够从您创建的实例中使用它们:

let player = UniversalAVPlayer(url: url) //imagine url is an actual URL
//your config methods will run instantly when you create this instance since they are called at initialization

//Call your methods like this when ever you need.
player.togglePlayer()