Преобразование NSDate из AVDateRangeMetadataGroup в CMTime
AVPlayer
первую очередь измеряет время с помощью CMTime
. Однако при использовании AVPlayerItemMetadataCollector
для сбора метаданных диапазона дат из потока HLS результирующая группа AVDateRangeMetadataGroup
содержит NSDate
вместо CMTime
s.
Моя проблема заключается в том, что я хочу добавить наблюдателя с граничным временем в плеер, поэтому я знаю, когда головка воспроизведения фактически входит в диапазон дат, но вы можете добавлять наблюдателя времени только с использованием CMTime
. AVPlayer
и AVPlayerItem
могут искать Date
и могут дать мне текущую головку воспроизведения как Date
, но я не вижу способа конвертировать данную Date
в CMTime
которую я могу использовать для установки пограничного наблюдателя времени.
Теоретически, если бы я знал, что говорит тег EXT-X-PROGRAM-DATE-TIME
я мог бы рассчитать смещение CMTime
самостоятельно, но я не вижу способа получить это.
Единственное, что я подумал, это получить как currentTime
и currentDate
из AVPlayerItem
, а затем рассчитать относительное смещение между currentDate
и моей целевой датой и применить это к CMTime
. Но проблема с этим решением заключается в том, что currentDate
и currentTime
не будут представлять точно такое же время. Дельта, по-видимому, будет очень мала, но она не будет равна нулю (если только сама rate
не равна нулю).
Ответы
Ответ 1
Надеюсь, это самое простое решение: вы можете попробовать использовать CMTime.init(seconds: Double, preferredTimescale: CMTimeScale)
Вы можете вычислить секунды из ваших объектов NSDate
и таким образом передать их в CMTime
функцию. Это может показаться тривиальным, но надеюсь, что это поможет.
Также, как я уже упоминал выше, чтобы узнать, когда currentTime
не находится в состоянии nil, попробуйте переопределить свойство и установить на нем наблюдателя свойств и поместить оператор print в ваше переопределение. Таким образом, вы увидите консоль отладки, когда она изменит состояние. Затем вы можете проследить его и установить для него контрольные точки.