Неточное время окончания аудиосегмента при использовании seekto
Используя AVPlayer, наше приложение для iOS/Swift 4.2 воспроизводит 1:30-минутный сегмент большего, примерно 100-минутного аудиофайла.
- После загрузки экрана (viewdidload) мы создаем и загружаем аудио в AVPlayerItem, а затем назначаем этот AVPlayerItem AVPlayer.
- Используя Observer для forKeyPath: "status", мы ищем начальную позицию сегмента, когда элемент находится в статусе AVPlayer.Status.readyToPlay, и затем мы запускаем команду воспроизведения.
- С помощью
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