Как синхронизировать проигрывание «слайдов» и проигрывание аудиофайла - PullRequest
0 голосов
/ 10 апреля 2019

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

Я пытался сделать это, внедрив таймер, а затем синхронизировав порядок воспроизведения звука и затем прокручивая слайды с помощью методов dispatchQueue.Однако я не могу заставить его полностью синхронизироваться.Я проверил другие ответы в StackOverFlow, в том числе: Ожидание завершения задачи .И я вижу, что одна из основных проблем заключается в том, что приложение должно распознавать, когда аудиофайл закончился, а не только когда он начался.Чтобы обойти это, я посмотрел на функцию - swift.AVPlayer.Как отследить, когда песня закончилась? .Однако я не могу интегрировать это.Буду благодарен за любую помощь.

Это функция таймера:

  func startSlideTimer() {

        timer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(self.scrollAutomatically), userInfo: nil, repeats: true)
    }

scroll. Автоматически это:

@objc func scrollAutomatically() {

        if let scrollCollectionView  = collectionView {
            for cell in scrollCollectionView.visibleCells {
                let indexPath = scrollCollectionView.indexPath(for: cell)!

                print("Scroll indexPath is \(indexPath)")

                let group = DispatchGroup()
                group.enter()

                DispatchQueue.main.async {
                    self.playAVatIndex()

                    if self.audioFinished == true {
                    group.leave()
                    }  *** This does not work


                }

                group.notify(queue: .main) {
                    if (indexPath.row < (self.selectedStory?.storyItems.count)! - 1) {

                        let indexPath1: IndexPath?

                        indexPath1 = IndexPath.init(row: (indexPath.row) + 1, section: (indexPath.section))

                        scrollCollectionView.scrollToItem(at: indexPath1!, at: .right, animated: true)

                    }

                    else {
                        self.stopTimer()
                    }
                }

            }
        }
    }

Функция воспроизведения аудиофайла здесь:

@objc func playAVatIndex() {

    if let scrollCollectionView  = collectionView {
        for cell in scrollCollectionView.visibleCells {
            let indexPath = scrollCollectionView.indexPath(for: cell)!

            let storyItem = selectedStory!.storyItems[indexPath.row]
            setUpPlayer(storyItem: storyItem)
            audioPlayer.play()

        }
    }
}

функция определения конца игры:

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        print("Finished playing")
        audioFinished = true *** assigned to relevant global variable
    }

Заранее спасибо за любую помощь в этом.

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