UISlider (программа обновления CADisplayLink) не возобновила обновление текущего времени audioPlayer - PullRequest
0 голосов
/ 25 октября 2019

Мое приложение использует UISlider в качестве индикатора выполнения для отслеживания и настройки прогресса воспроизведения звука. Что касается кода, я использую средство обновления CADisplayLink для отслеживания текущего времени аудио. Этот индикатор выполнения может хорошо обновляться, когда приложение возвращается из фона, audioPlayer currentTime обновляется хорошо.

Если я приостанавливаю audioPlayer при воспроизведении VC и нажатие клавиши питания переводит приложение в фоновый режим. И снова откройте его, нажав кнопку командного центра, после чего звук может возобновиться, чтобы начать воспроизведение с предыдущей приостановленной позиции. Но откройте приложение из командного центра, индикатор выполнения перестает обновляться и остается на предыдущей приостановленной позиции.

Из консоли ниже кажется, что кнопка воспроизведения через командный центр создает еще один sharedInstance воспроизведения звука, который продолжает воспроизводиться, однако определенный ранее использованный общий звук все еще находится в состоянии паузы, так как повторное normalizedTime: 4.175662 вконец консольного журнала. Я искал это в течение 2 дней, не могу прийти к какому-либо заключению, нужна помощь здесь.

/ / / updatecat func () и вызов его в viewDidLoad

func updateSlider() {
        updater = CADisplayLink(target: self, selector: #selector(trackAudio))
        updater.preferredFramesPerSecond = 1
        updater.add(to: .current, forMode: .common)
        print("updater start")

        theProgressBar.minimumValue = 0
        theProgressBar.maximumValue = 100
    }

    @objc func trackAudio() {
        let normalizedTime = Float(AudioManager.sharedInstance.audioPlayer.currentTime * 100.0 / AudioManager.sharedInstance.audioPlayer.duration)
        print("normalizedTime: ", normalizedTime)
        theProgressBar.value = normalizedTime
        let nowSeconds = Int(AudioManager.sharedInstance.audioPlayer.currentTime)
        let (mm, ss) = secondsToMinSec(seconds: nowSeconds)
        if ss < 10 {
            startTime.text = "\(mm):0\(ss)"
        } else {
            startTime.text = "\(mm):\(ss)"
        }

        let leftSeconds = Int(AudioManager.sharedInstance.audioPlayer.duration - AudioManager.sharedInstance.audioPlayer.currentTime)
        let (leftM, leftS) = secondsToMinSec(seconds: leftSeconds)

        if leftS < 10 {
            leftTime.text = "-\(leftM):0\(leftS)"
        } else {
            leftTime.text = "-\(leftM):\(leftS)"
        }
    }

/ / /центр

 commandCenter.playCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
            SongData.isPlaying = true
            AudioManager.sharedInstance.playMusic()
            // continue update playing progress
            self.updateLockedScreenPlayingInfo()
            // self.updateSlider()
            print("play music in command center")
            print("updater.isPaused: ", self.updater.isPaused)
            print("audioPlayer.isPlaying:", AudioManager.sharedInstance.audioPlayer.isPlaying)

            self.playOrPauseButton.setImage(UIImage(named: "Pause"), for: .normal)
            self.playOrPauseButton.imageView?.contentMode = .scaleAspectFit
            return .success
        }

/ / / Консоль журнала

normalizedTime:  0.019696647
normalizedTime:  0.61259955
normalizedTime:  1.209875
normalizedTime:  1.8072453
normalizedTime:  2.40425
normalizedTime:  3.001539
normalizedTime:  3.5990038
pause the music playing
SongData.isPlaying == false, current time is: 6.867210884353741
normalizedTime:  4.099664
normalizedTime:  4.099664
normalizedTime:  4.099664
normalizedTime:  4.099664
normalizedTime:  4.099664
normalizedTime:  4.099664
normalizedTime:  4.099664
Playback OK
Session is Active
2019-10-25 13:33:46.890137+0800 Vanilla Music[19150:1385884] Can't end BackgroundTask: no background task exists with identifier 2 (0x2), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.
SongData.isPlaying == true, current time is: 6.873015873015873
play music in command center
updater.isPaused:  false
audioPlayer.isPlaying: true
normalizedTime:  4.104497
normalizedTime:  4.175662
normalizedTime:  4.175662
normalizedTime:  4.175662
normalizedTime:  4.175662
normalizedTime:  4.175662
normalizedTime:  4.175662
normalizedTime:  4.175662
normalizedTime:  4.175662
normalizedTime:  4.175662
normalizedTime:  4.175662
normalizedTime:  4.175662
normalizedTime:  4.175662

/// аудио класс

class AudioManager: NSObject, AVAudioPlayerDelegate {
    // use Singleton pattern keep the music continuing when user move through the App.
    static let sharedInstance = AudioManager()

    var audioPlayer: AVAudioPlayer!
    var playingSong: SongData?

    private override init() {
        super.init()
    }

    func startTrack(idx: Int, songList: [SongData]) {
        // check segue triggered from where, table cell click or navi button
        if SongData.segueShowCurrentSong {
            if SongData.isPlaying {
                playMusic()
            } else {
                // do nothing
                print("resume pause state of nowPlaying scene")
            }
        } else {
            do {
                try audioPlayer = AVAudioPlayer(contentsOf: songList[idx].url)
                audioPlayer.prepareToPlay()
                audioPlayer.play()
            } catch {
                print("could not load file")
            }
        }
    }

    func playMusic() {
        audioPlayer.play()
    }

    func pauseMusic() {
        audioPlayer.pause()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...