Как показать приостановленное видео вместо черного экрана при запуске AVPlayer

Я могу успешно создать игрока, но его раздражает начальный черный экран. Я решил наложить UIImageView и скрыть его, как только игрок начал. Это сработало, но я не хотел хлопот создавать и поддерживать изображения для всех моих видео.

Я смог добиться точных результатов, которые я хотел сыграть, и сразу же приостановил игру после создания экземпляра. Единственная проблема заключалась в том, что иногда состояние игрока регистрировалось некорректно, поэтому, когда я снова начал играть с игроком, статус был указан как уже "играющий", хотя игрок был приостановлен.

Я начинаю изучать использование AVPlayerItem seekToTime, но не нашел возможных решений. Существует ли "ненадежный" способ достижения этого?

Ответы

Ответ 1

Если вы используете AVPlayerViewController, это идеальное использование свойства контроллера игрока contentOverlayView. Это UIView между слоем игрока и элементами управления, открытыми именно для этой цели:

Сначала создайте снимок экрана:

let asset = AVAsset(URL: URL(string: "")!) // link to some video
let imageGenerator = AVAssetImageGenerator(asset: asset)
let screenshotTime = CMTime(seconds: 1, preferredTimescale: 1)
if let imageRef = try? imageGenerator.copyCGImageAtTime(screenshotTime, actualTime: nil) {

    let image = UIImage(CGImage: imageRef)

    // see part 2 below
}

Теперь добавьте изображение в виде подкатегории contentOverlayView в контроллере плеера:

// in the same try block

let imageView = UIImageView(image: image)
let playerVC = AVPlayerViewController()
let playerItem = AVPlayerItem(asset: asset)
playerVC.player = AVPlayer(playerItem: playerItem)

self.presentViewController(playerVC, animated: true) { 
    playerVC.contentOverlayView?.addSubview(imageView)
    // adjust the frame of your imageView to fit on the player controller contentOverlayView
}

Затем удалите подвектор imageView, когда игрок начнет играть в актив или завершает буферизацию.

Ответ 2

AVPlayerLayer, связанный с вашим плеером, имеет свойство readyForDisplay.

Вы можете попытаться сделать свой хост наблюдателем для этого значения и обновить его, как только оно будет установлено в true.

Он установлен в true, когда первый кадр готов к визуализации, поэтому перед тем, как у игрока будет достаточно данных для воспроизведения и установите его статус в readyToPlay.