AVPlayerLayer не показывает видео AVPlayer?

Что за хитрость в том, чтобы видеоконтент AVPlayer отображался в поле зрения?

Мы используем следующий код AVPlayer, но на экране ничего не появляется. Мы знаем, что видео есть, потому что мы смогли показать его с помощью MPMoviePlayerController.

Вот код, который мы используем:

AVAsset *asset = [AVAsset assetWithURL:videoTempURL];
AVPlayerItem *item = [[AVPlayerItem alloc] initWithAsset:asset];
AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:item];
player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:player];
// layer.frame = self.view.frame;
[self.view.layer addSublayer:layer];
layer.backgroundColor = [UIColor clearColor].CGColor;
//layer.backgroundColor = [UIColor greenColor].CGColor;
[layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[player play];

Неправильно ли мы настраиваем слой для текущего вида?


person Praxiteles    schedule 14.07.2015    source источник
comment
Входит ли видеомагазин в ваш пакет?   -  person user2924482    schedule 22.08.2015


Ответы (2)


Вам нужно установить свойство кадра слоя. например.:

 self.playerLayer.frame = CGRectMake(0, 0, 100, 100)

Если вы попробовали это, и это не сработало в представлении контроллера представления, вероятно, вы пытались установить свойство frame слоя в свойство frame или bounds контроллеров представления, которое было {0, 0, 0, 0} во время создания AVPlayerLayer. Вам нужно будет установить кадр игрока во время проходов макета, после чего frame контроллера представления будет установлено на что-то отличное от {0, 0, 0, 0}. Чтобы сделать это правильно:

Если вы используете автоматический макет в пользовательском UIView (включая IB):

override func layoutSubviews() {
    super.layoutSubviews()

    //Match size of view
    CATransaction.begin()
    CATransaction.setDisableActions(true)
    self.playerLayer.frame = self.bounds
    CATransaction.commit()
}

Если вы используете автоматический макет в пользовательском UIViewController:

override fun viewDidLayoutSubviews() {
  //Match size of view-controller
  CATransaction.begin()
  CATransaction.setDisableActions(true)
  self.playerLayer.frame = self.view.bounds
  CATransaction.commit()
}

Строки CATransaction предназначены для отключения неявной анимации при изменении кадра слоя. Если вам интересно, почему это обычно не требуется, это потому, что слои, поддерживающие UIView, не будут неявно анимироваться по умолчанию. В этом случае мы используем слой без просмотра (AVPlayerLayer).

Лучший путь — добавить новое представление в ваш контроллер представления через сборку интерфейса и установить собственный класс для вновь добавленного представления. Затем создайте этот пользовательский класс представления и реализуйте код layoutSubviews.

person seo    schedule 17.12.2015
comment
Это не сработало для меня; свойство фрейма сразу имеет правильные значения (не CGRectZero), но повторная установка не помогает. (iOS 14, реальное устройство). - person Mr. Zystem; 04.07.2021

Оказывается, для воспроизведения AVPlayer требуется собственное контекстное представление.

Мы добавили этот код, и теперь видео воспроизводится. К сожалению, AVPlayer не имеет встроенных элементов управления, в отличие от MPMoviePlayerController. Непонятно, почему Apple отказывается от инструмента, который будет иметь нестандартные параметры воспроизведения видео.

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0, 320.0f, 200.0f)];
layer.frame = self.view.frame;
[containerView.layer addSublayer:layer];
[self.view addSubview:containerView];
layer.backgroundColor = [UIColor greenColor].CGColor;
[layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[player play];
person Praxiteles    schedule 14.07.2015
comment
Не работает для меня. У меня есть специальный UIView в раскадровке, который содержит слой игрока. Я вижу зеленый цвет фона, но нет видео. - person ninjaneer; 01.02.2016