Добавить AVPlayerLayer в UIViewController - PullRequest
0 голосов
/ 17 января 2019

Возможно ли отобразить AVPlayerLayer внутри UIViewController, который позже будет отображен в UIView.

Пример кода того, что я пытаюсь сделать:

...
UIView *parentView = reinterpret_cast<UIView *>(window->winId());

AVPlayer *_player;
AVURLAsset *_asset;
AVPlayerItem *_playerItem;
AVPlayerLayer *m_playerLayer;
_player = [[AVPlayer alloc] init];
NSURL *baseURL = [[NSURL alloc] initWithString: @"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
_asset = [AVURLAsset assetWithURL:baseURL];
_playerItem = [AVPlayerItem playerItemWithAsset: _asset];
[_player replaceCurrentItemWithPlayerItem:_playerItem];
m_playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];

// works with AVPlayerViewController
// AVPlayerViewController *playerController = [[AVPlayerViewController alloc] init];
// playerController.player = _player;

UIViewController *viewController = [[UIViewController alloc] init];
[viewController.view.layer addSublayer:m_playerLayer];

viewController.view.frame = CGRectMake(this->x(), this->y(), this->width(), this->height());
[parentView addSubview:viewController.view];

[_player play];
...

Это работает, если я пытаюсь добавить плеер в AVPlayerViewController и затем отобразить его, но я бы хотел использовать только AVPlayerLayer, так как мне не нужны элементы управления видео, так как я буду реализовывать функциональность отдельно.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Я вложил в подкласс UIView и добавил на AVPlayerLayer с помощью метода SH_Khans

_player = [[AVPlayer alloc] init];
NSURL *baseURL = [[NSURL alloc] initWithString: @"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
_asset = [AVURLAsset assetWithURL:baseURL];
_playerItem = [AVPlayerItem playerItemWithAsset: _asset];
[_player replaceCurrentItemWithPlayerItem:_playerItem];
m_playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
m_playerLayer.frame = self.view.bounds;
[self.view.layer addSublayer:m_playerLayer ]; 
[_player play];

Тогда относитесь к подклассу UIView так, как вы хотите. Пара вещей, однако, если вы изменяете размер AVPlayerLayerUIView, вы должны изменить размер AVPlayerLayer, поскольку система не делает этого автоматически. Кроме того, не забудьте привязать к границам AVPlayerLayerUIView, иначе он не будет соответствовать вашему кадру, как вы хотите.

0 голосов
/ 17 января 2019

Вы можете использовать AVPlayerViewController с

avController.showsPlaybackControls = false;

Или просто добавить слой

_player = [[AVPlayer alloc] init];
NSURL *baseURL = [[NSURL alloc] initWithString: @"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
_asset = [AVURLAsset assetWithURL:baseURL];
_playerItem = [AVPlayerItem playerItemWithAsset: _asset];
[_player replaceCurrentItemWithPlayerItem:_playerItem];
m_playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
m_playerLayer.frame = self.view.bounds;
[self.view.layer addSublayer:m_playerLayer ]; 
[_player play];

enter image description here

...