Search code examples
iosobjective-cuiviewuiviewcontrolleruikit

Add AVPlayerLayer to UIViewController


Is it possible to display AVPlayerLayer inside a UIViewController which is later on displayed in UIView.

The sample code of what I'm trying to do:

...
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];
...

It works if I try to add the player to AVPlayerViewController and then display it, but I would want to use only AVPlayerLayer since I don't need video controls as I'll implement the functionality separately.


Solution

  • You can use AVPlayerViewController with

    avController.showsPlaybackControls = false;
    

    Or simply add the layer

    _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