【发布时间】: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