Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift 5:AVPlayer将多个音频文件相互层叠_Ios_Swift_Xcode_Avplayer_Swift5 - Fatal编程技术网

Ios Swift 5:AVPlayer将多个音频文件相互层叠

Ios Swift 5:AVPlayer将多个音频文件相互层叠,ios,swift,xcode,avplayer,swift5,Ios,Swift,Xcode,Avplayer,Swift5,我正在构建一个Swift 5音乐应用程序,其中一个表视图从JSON API加载并列出多个对象。单击条目后,导航器将调用所选项目的详细视图 下面,您可以看到我的详细视图控制器,名为BroadcastDetailViewController。如您所见,有一个播放广播按钮,它将播放音频文件并设置音频会话 到目前为止还不错。但在我实现了通过控制中心清理器(commandCenter.changePlaybackPositionCommand.addTarget)清理音频文件并返回到我的表视图控制器并选择

我正在构建一个Swift 5音乐应用程序,其中一个表视图从JSON API加载并列出多个对象。单击条目后,导航器将调用所选项目的详细视图

下面,您可以看到我的详细视图控制器,名为
BroadcastDetailViewController
。如您所见,有一个
播放广播按钮
,它将播放音频文件并设置
音频会话

到目前为止还不错。但在我实现了通过控制中心清理器(
commandCenter.changePlaybackPositionCommand.addTarget
)清理音频文件并返回到我的表视图控制器并选择另一项播放其音频文件后,AVPlayer会将多个音频文件分层并同时播放。这是我不想要的行为。在我执行控制按钮之前,整个音频文件替换过程运行良好

我的问题是,为什么玩家突然在另一个文件之上播放另一个文件,而不是静音/回避旧文件并用新文件替换

class BroadcastDetailViewController: UIViewController {

    var player = AVPlayer()
    var playerItem: AVPlayerItem!

    var broadcast:Broadcasts?

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var titleLabel: UILabel!

    @IBAction func playBroadcastButton(_ sender: Any) {
        player.play()
        setupAVAudioSession()
    }

    private func setupAVAudioSession() {
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
            try AVAudioSession.sharedInstance().setActive(true)
            debugPrint("AVAudioSession is Active and Category Playback is set")
            UIApplication.shared.beginReceivingRemoteControlEvents()
            setupCommandCenter()
        } catch {
            debugPrint("Error: \(error)")
        }
    }

    private func setupCommandCenter() {

        // Meta
        var nowPlayingInfo = [String : Any]()

        nowPlayingInfo[MPMediaItemPropertyTitle] = broadcast?.title ?? "Radio Bass"
        nowPlayingInfo[MPMediaItemPropertyArtist] = "Radio Bass"
        nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = "Radio Bass."
        nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = playerItem.currentTime().seconds
        nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = playerItem.asset.duration.seconds
        nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate

        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo

        let commandCenter = MPRemoteCommandCenter.shared()
        commandCenter.playCommand.isEnabled = true
        commandCenter.pauseCommand.isEnabled = true
        commandCenter.playCommand.addTarget { [weak self] (event) -> MPRemoteCommandHandlerStatus in
            self?.player.play()
            return .success
        }
        commandCenter.pauseCommand.addTarget { [weak self] (event) -> MPRemoteCommandHandlerStatus in
            self?.player.pause()
            return .success
        }

        // Scrubber
        commandCenter.changePlaybackPositionCommand.addTarget { event in
            let seconds = (event as? MPChangePlaybackPositionCommandEvent)?.positionTime ?? 0
            let time = CMTime(seconds: seconds, preferredTimescale: 1)
            self.player.seek(to: time)
            return .success
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let urlAudioString = broadcast?.audio

        playerItem = AVPlayerItem(url: URL(string: urlAudioString!)!)
        player = AVPlayer(playerItem: playerItem)

        title = broadcast?.title

        let urlImageString = broadcast?.image
        let urlImage = URL(string: urlImageString!)

        titleLabel.text = broadcast?.title
        imageView.load(url: urlImage!)
    }
}

返回表视图控制器之前,释放/释放并停止
AVPlayer
AVPlayerItem

avPlayer.pause()
avPlayer.cancelPendingPrerolls() // stops network requests
avPlayer.replaceCurrentItem(with: nil)