Как я могу получить текущее время HLS-потока с помощью AVPlayer?

Я пытаюсь получить позицию потока HLS, который воспроизводится AVPlayer, относительно начала потока.

Все, что мне удалось получить, это время от начала воспроизведения (с помощью AVPlayer.currentTime()) и дату начала потока (с помощью AVPlayerItem.currentDate()).

Я на 100% уверен, что смещение в секундах встроено в каждый файл MPEG TS, я просто не могу найти способ получить доступ к этому значению из AVPlayer или AVPlayerItem.

Вывод FFProbe для тестового фрагмента TS:

ffprobe version 3.3.4 Copyright (c) 2007-2017 the FFmpeg developers
  built with Apple LLVM version 8.1.0 (clang-802.0.42)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-vda
  libavutil      55. 58.100 / 55. 58.100
  libavcodec     57. 89.100 / 57. 89.100
  libavformat    57. 71.100 / 57. 71.100
  libavdevice    57.  6.100 / 57.  6.100
  libavfilter     6. 82.100 /  6. 82.100
  libavresample   3.  5.  0 /  3.  5.  0
  libswscale      4.  6.100 /  4.  6.100
  libswresample   2.  7.100 /  2.  7.100
  libpostproc    54.  5.100 / 54.  5.100
Input #0, mpegts, from 'toCharlie.ts':
  Duration: 00:00:08.40, start: 16117.400000, bitrate: 1808 kb/s
  Program 1 
    Stream #0:0[0x102]: Data: timed_id3 (ID3  / 0x20334449)
    Stream #0:1[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 720x1280, 30 fps, 30 tbr, 90k tbn, 60 tbc
    Stream #0:2[0x101]: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 132 kb/s

Смещение в секундах есть (start: 16117.400000).

Можно ли вообще получить фактическое текущее время с начала потока?

Заранее спасибо.

РЕДАКТИРОВАТЬ: для ясности поток HLS - это живой поток, а не поток VOD.


person Carlo Vespa    schedule 29.09.2017    source источник
comment
Вы когда-нибудь решали это? У меня такая же проблема   -  person Tometoyou    schedule 14.07.2019
comment
@Tometoyou Это было давно, но если я не ошибаюсь, мы исправили это из источника, мы изменили способ кодирования HLS, но я действительно не помню, в чем проблема. Извини.   -  person Carlo Vespa    schedule 11.02.2020


Ответы (1)


Вы пробовали addObserver вместо AVPlayer вот так:

player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)

и используя функцию:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {.....

чтобы отслеживать реакцию статуса в этом с помощью концепции KVO из iOS

person Huy Nguyen    schedule 29.09.2017
comment
Да и не получится. AVPlayer не может загружаться с начала потока, потому что это прямой эфир и его нельзя найти. - person Carlo Vespa; 29.09.2017