我正在使用AVPlayer播放流式音频,并且希望阻止它一次播放多个音轨。什么是最好的方法来做到这一点?我的方法完全是编程式的 - 我不使用故事板。当一个URL被发送到ViewController(VC,委托)时,它会建立一个新的播放器实例 - 我认为这是问题,但我不确定。谢谢。防止AVPlayer一次播放多个音轨的最佳方法
//this routine returns the url from control to the VC (delegate)
func selectedAudio(_ audioUrl:String?) {
if let urlString = audioUrl {
setupPlayer(urlString)
}
}
//single button which toggles between play/pause
func playOrPauseTouched() {
if isPlaying {
pausePlayer()
} else {
playPlayer()
}
}
func playPlayer() {
if player == nil || selectedTrackName != currentTrackLabel.text{
if let urlString = selectedAudioUrl {
setupPlayer(urlString)
currentTrackLabel.text = "Playing: \(selectedTrackName ?? "")"
}
}
player?.play()
isPlaying = true
playPauseButton.setImage(UIImage(named: "pause"), for: .normal)
activityIndicatorView.startAnimating()
}
func pausePlayer() {
player?.pause()
isPlaying = false
playPauseButton.setImage(UIImage(named: "play"), for: .normal)
}
func setupPlayer(_ urlString:String) {
if let url = URL(string:urlString) {
player = AVPlayer(url: url)
let playerLayer = AVPlayerLayer(player: player)
player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)
let interval = CMTime(value: 1, timescale: 5) //gives smooth thumb movement w/short clips
player?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { (progressTime) in
let seconds = CMTimeGetSeconds(progressTime)
let secondsString = String(format: "%02d", Int(seconds.truncatingRemainder(dividingBy: 60)))
let minutesString = String(format: "%02d", Int(seconds/60))
self.currentTimeLabel.text = "\(minutesString):\(secondsString)"
if let duration = self.player?.currentItem?.duration {
let durationSeconds = CMTimeGetSeconds(duration)
self.audioSlider.value = Float(seconds/durationSeconds)
}
})
}
}
您是否在创建新实例之前尝试停止'player'? –
我不知道AVPlayer的停止方法(虽然我见过一个AVAudioPlayer)。但我可能会错过一些东西。我知道的唯一文档是Objective-C而不是Swift,这使我很难 –
事实上,没有停止方法。尝试['pause()'](https://developer.apple.com/documentation/avfoundation/avplayer/1387895-pause)有助于了解它是否是之前的“AVPlayer”。 –