Есть ли способ исправить воспроизведение звука A после того, как также начал воспроизводиться звук B? - PullRequest
1 голос
/ 10 июля 2019

Я создаю приложение, в котором пользователи могут выбирать аудиофайл для воспроизведения.Это нормально работает и играет, даже когда экран заблокирован.Проблема состоит в том, что после того, как аудиофайл был изменен пользователем, первый аудиофайл все еще воспроизводится в фоновом режиме и перекрывается с файлом, который пользователь хочет прослушивать.

let player: AVPlayer = {
        let avPlay = AVPlayer()
        avPlay.allowsExternalPlayback = false
        avPlay.automaticallyWaitsToMinimizeStalling = false
        return avPlay
    }()

fileprivate func setupLockScreenCurrentTime(){
        var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo
//      nowPlayingInfo = nil

        guard let currentItem = player.currentItem else{return}
        let durationInSecs = CMTimeGetSeconds(currentItem.duration)
//      let elapsed = CMTimeGetSeconds(player.currentTime())
        nowPlayingInfo?[MPMediaItemPropertyPlaybackDuration] = durationInSecs

        MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
    }
fileprivate func playSermon(){
        let credential = URLCredential(user: "1234user" , password: "password", persistence: .forSession)
        let protectionSpace = URLProtectionSpace(host: "example.com", port: 443, protocol: "https", realm: "Restricted", authenticationMethod: NSURLAuthenticationMethodHTTPBasic)
        URLCredentialStorage.shared.setDefaultCredential(credential, for: protectionSpace)
        let ssurl = SermonHelper.sharedInstance.url
        let urlNew:String = ssurl.replacingOccurrences(of: " ", with: "%20")
        guard let url = URL(string: urlNew) else {return}
        let playerItem = AVPlayerItem(url: url)
        player.replaceCurrentItem(with: playerItem)
        player.isMuted = false
        player.play()
        observePlayerCurrentTime()

    }

fileprivate func setupRemoteControl(){
        UIApplication.shared.beginReceivingRemoteControlEvents()

        let commandCenter = MPRemoteCommandCenter.shared()
        commandCenter.playCommand.isEnabled = true
        commandCenter.playCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
            self.player.play()
            self.enlargeEpisodeImageView()
            self.playPauseButton.setImage(UIImage(named: "my_pause2"), for: .normal)
            self.setupElapsedTime(rate: 1)
            return .success
        }

        commandCenter.pauseCommand.isEnabled = true
        commandCenter.pauseCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
            self.player.pause()
            self.shrinkEpisodeImageView()
            self.playPauseButton.setImage(UIImage(named: "my_play2"), for: .normal)
            self.setupElapsedTime(rate: 0)
            return .success
        }

        commandCenter.togglePlayPauseCommand.isEnabled = true
        commandCenter.togglePlayPauseCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
            if self.player.timeControlStatus == .playing {
                self.player.pause()
                self.shrinkEpisodeImageView()
                self.playPauseButton.setImage(UIImage(named: "my_play2"), for: .normal)
            }
            else {
                self.player.play()
                self.enlargeEpisodeImageView()
                self.playPauseButton.setImage(UIImage(named: "my_pause2"), for: .normal)
            }
            return .success
        }
        commandCenter.skipForwardCommand.isEnabled = true
        commandCenter.skipForwardCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
            self.seekToCurrentTime(delta: 15)
            let t = CMTimeAdd(self.player.currentTime(), CMTimeMake(15, 1))
            MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(t)
            return .success
        }

        commandCenter.skipBackwardCommand.isEnabled = true
        commandCenter.skipBackwardCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
            self.seekToCurrentTime(delta: -15)
            let n = CMTimeAdd(self.player.currentTime(), CMTimeMake(-15, 1))
            MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = CMTimeGetSeconds(n)
            return .success
        }
    }

Я ожидаю, что воспроизводимый звук будет заменен новым аудиофайлом, выбранным пользователем, но я получаю звук из двух файлов, которые воспроизводятся одновременно.

1 Ответ

0 голосов
/ 10 июля 2019

Нигде в вашем коде не отображается, когда вы останавливаете воспроизведение текущего звука перед заменой его новым звуком в playSermon().Попробуйте сделать это.Скорее всего, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...