Преобразование 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 в ваше переопределение. Таким образом, вы увидите консоль отладки, когда она изменит состояние. Затем вы можете проследить его и установить для него контрольные точки.