【问题标题】:AVPlayer play continuouslyAVPlayer 连续播放
【发布时间】:2023-03-18 22:20:01
【问题描述】:

我有一个对象数组。每个对象都有一个属性 url。使用这个网址,我正在AVPlayer 上播放音频。

func playAudio(url: URL)
    {
        let player = AVPlayer(url: url )
        let playerViewController = AVPlayerViewController()
        playerViewController.player = player
        self.present(playerViewController, animated: true)
        {
            do
            {
                try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
                    try AVAudioSession.sharedInstance().setActive(true)
            }
            catch _ as NSError {

            }

            playerViewController.player!.play()
        }

        NotificationCenter.default.addObserver(self, selector: #selector(CourseDetailViewController.moviePlayBackDidFinish(notification:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
    }

我想连续播放所有对象的音频。我已经设置了

NotificationCenter.default.addObserver(self, selector: #selector(CourseDetailViewController.moviePlayBackDidFinish(notification:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)  

CourseDetailViewController.moviePlayBackDidFinish 中,我再次调用playAudio。然后我将 player 作为一个全局变量,这样它就不会再次初始化。但是没有AVPlayer 的重载,我们可以将url 提供给已经存在的AVPlayer。如果为下一个音频执行let player = AVPlayer(url: url ),它不会播放,因为前一个 AVPlayer 实例在前台。 这是我在播放连续音频时面临的挑战。如果有更好更简洁的方法来做到这一点,我将不胜感激。

【问题讨论】:

  • 你不需要嵌套那些try 语句。您可以将它们放在一个 do 块中。
  • 我认为你需要一个 AVPlayerQueue 对象。谷歌一下。
  • @Fogmeister:同意。更改了代码。谢谢。
  • 另一个说明。如果你没有对这些错误做任何事情,你可以只做 try? ThingThatThrows 并且你根本不需要 do catch 块。 ??????

标签: ios swift avplayer avplayerviewcontroller


【解决方案1】:

我在 AVPlayer 中做了同样的事情,但连续播放视频。我希望你能以完全相同的方式解决这个问题。添加一个观察者来检查玩家是否到达了项目的末尾。当每个项目最后到达时,都会调用通知。

  • 添加观察者:

    NotificationCenter.default.addObserver(self,
                                           selector: #selector(playerItemDidReachEnd(notification:)),
                                           name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
                                           object: avPlayer.currentItem)
    avPlayer.play()
    
  • 通知方式:

    func playerItemDidReachEnd(notification: Notification){ //TODO: Add your code here.. }

【讨论】:

  • 谢谢阿纳斯。您建议的代码,我已经在这样做了。我现在面临的问题是在上面的代码之后,我现在可以开始工作了。
【解决方案2】:

你看过AVQueuePlayer。该播放器用于按顺序播放多个项目。 SDK Docs at link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    相关资源
    最近更新 更多