Как получить размер видео для потока HLS внутри AVPlayer?

Я пытаюсь получить разрешение видео при игре в потоке hls. У меня типичная инициация игрока:

let urlAsset = AVURLAsset(URL: currentVideoUrl)
 self.player=AVPlayer(playerItem: AVPlayerItem(asset:urlAsset))
 .......

Я использую KVO, и я пытаюсь получить размер видео, когда получаю .ReadyToPlay status для AVPlayerItem:

    func resolutionSizeForVideo() {

    guard let videoTrack = self.player.currentItem?.asset.tracksWithMediaType(AVMediaTypeVideo).first else
    { return
    }

    let size = CGSizeApplyAffineTransform(videoTrack.naturalSize, videoTrack.preferredTransform)
    let frameSize = CGSize(width: fabs(size.width), height: fabs(size.height))
    print ("video size: \(frameSize)")

}

Проблема заключается в том, что trackWithMediaType() всегда возвращает пустой массив (но работает для файлов без потока, например, для .mov).

Как я могу получить размер (CGRect) видео HLS, воспроизводимого внутри AVPlayer?

Ответ 1

Треки всегда будут возвращать нуль при использовании HLS. Если у вас есть подкласс UIView, который переопределяет его layerClass с помощью AVPlayerLayer для воспроизведения видео, вы можете получить размер с помощью

playerView.layer.videoRect

Это размер только видео, а не всего слоя.

В качестве альтернативы вы можете использовать KVO для наблюдения за представлением размера элемента

player.addObserver(self, forKeyPath: "currentItem.presentationSize", options: [.Initial, .New], context: nil)

Ответ 2

Можете ли вы зарегистрировать хотя бы информацию о видео с помощью этого метода?

func checkVideoRez(videoURL: NSURL) -> Bool {

let videoAssetSource = AVAsset.init(URL: videoURL)
let videoTrack = videoAssetSource.tracksWithMediaType(AVMediaTypeVideo)[0]
let size = videoTrack.naturalSize
let txf = videoTrack.preferredTransform

let realVidSize = CGSizeApplyAffineTransform(size, txf)

print(videoTrack)
print(txf)
print(size)
print(realVidSize)

...

}

Ответ 3

Массив треков пуст для HSL. Вы можете рассчитать размер загруженного потока HLS на вашем устройстве: fooobar.com/questions/2396688/...

Ответ 4

Вы можете напрямую получить доступ к трекам проигрывателя, а затем рассчитать размер:

   let naturalSize = player?.currentItem?.tracks.first?.assetTrack?.naturalSize
   let preferredTransform = videoTrack.preferredTransform

   let realSize = CGSizeApplyAffineTransform(naturalSize!, preferredTransform)

   print("natural size \(naturalSize!)")
   print("real size \(realSize!)")