Неточное время окончания аудиосегмента при использовании seekto - PullRequest
0 голосов
/ 14 декабря 2018

Используя AVPlayer, наше приложение для iOS / Swift 4.2 воспроизводит 1:30-минутный сегмент большего, примерно 100-минутного аудиофайла.

  1. После загрузки экрана (viewdidload) мы создаем и загружаем аудио в AVPlayerItem, а затем назначаем этот AVPlayerItem AVPlayer.
  2. Используя Observer для forKeyPath: «status», мы ищем начальную позицию сегмента, когда элемент находится в статусе AVPlayer.Status.readyToPlay, а затем запускаем команду воспроизведения.
  3. Используя команду self.audioPlayer?.addPeriodicTimeObserver, мы добавляем периодический наблюдатель времени, который (1) проверяет, наступило ли текущее время элемента после окончания сегмента.Если это так, то мы прекращаем играть и стремимся вернуться к началу сегмента.(2) Он обновляет положение элемента управления UISlider на экране.

Обратите внимание, что seekto всегда вызывается с допуском 0, До и После:

 let seekto = CMTimeMakeWithSeconds(Double(self.audioSlider.value), preferredTimescale: Int32(NSEC_PER_SEC));

         print("player:slider seekto:\(seekto.seconds)")
           self.audioPlayer?.seek( to: seekto, toleranceBefore: CMTime.zero, toleranceAfter: CMTime.zero, completionHandler: { completed in
                print("->seek to (from slider) completed:\(seekto.seconds), paused: \(self.paused)")
                if (self.paused == false )  {
                        self.audioPlayer?.play()
                }
          });

Если мы слушаемдля сегмента от начала до конца мы получаем последовательные результаты, то есть звуки, которые мы слышим в начале и конце сегмента, являются одинаковыми при каждом воспроизведении сегмента.

Однако: используя кнопку, мы ищем 3 секунды до конца сегмента и слушаем конец.Звук, который мы здесь видим в конце, непротиворечив, но отличается от того, который мы слышим, когда играем сегмент от начала до конца.

Далее, если мы скользим к концу сегмента с помощью ползунка и ищем длясоответствующую позицию и продолжая прислушиваться к концу, мы получаем противоречивые результаты.Звуки отличаются от того, что мы ожидаем услышать, и от того, что мы слышим, когда не используем ползунок.

Как мы получаем последовательные результаты?Что может быть причиной таких несоответствий при воспроизведении при использовании seekto?

Редактировать: вот приложение, иллюстрирующее проблему: https://github.com/christoforosl/SwiftAudioPlayerSample.git

...