Лично я не согласен, что значение timeRanges всегда будет иметь значение 1.
Согласно документации
Массив содержит объекты NSValue, содержащие значение CMTimeRange, указывающее временные диапазоны, в течение которых у элемента проигрывателя доступны медиаданные. Возвращенные диапазоны времени могут быть прерывистыми.
Так что это может иметь значения, подобные:
[(начало1, конец1), (начало2, конец2)]
Исходя из моего опыта работы с каркасом hls.js в мире настольных компьютеров, дыры между этими временными интервалами могут быть очень маленькими или большими в зависимости от множества факторов, например: поиск, разрывы и т. Д.
Таким образом, чтобы правильно получить общую длину буфера, вам нужно пройтись по массиву и получить длительность каждого элемента и конкататы.
Если вы ищете значение буфера в текущей воспроизводящей головке, вам необходимо отфильтровать временные диапазоны для времени начала, которое больше текущего времени, и времени окончания, которое меньше текущего времени.
public extension AVPlayerItem {
public func totalBuffer() -> Double {
return self.loadedTimeRanges
.map({ $0.timeRangeValue })
.reduce(0, { acc, cur in
return acc + CMTimeGetSeconds(cur.start) + CMTimeGetSeconds(cur.duration)
})
}
public func currentBuffer() -> Double {
let currentTime = self.currentTime()
guard let timeRange = self.loadedTimeRanges.map({ $0.timeRangeValue })
.first(where: { $0.containsTime(currentTime) }) else { return -1 }
return CMTimeGetSeconds(timeRange.end) - currentTime.seconds
}
}