我有一个带有 UIImageView 的轮播对象,我试图在其中对 AvPlayerLayer 进行 subLayer。

它工作得很好,虽然它没有填充 _videoView 的完整边界,但它的高度似乎更小,尽管我已经测试过将高度更改为极值,并且只要它与 UIImageView 重叠,它仍然处于该大小。

我用来实现这一点的代码如下:

    UIView *embeddedView = [[UIView alloc] initWithFrame:_videoView.bounds];
embeddedView.center = CGPointMake(100, 140);
AVPlayerItem *avPlayeritem = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:[_videoURLS objectAtIndex:carousel.currentItemIndex]]];
AVPlayer *avPlayer = [[AVPlayer alloc] initWithPlayerItem:avPlayeritem];
AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
[avPlayerLayer setFrame:embeddedView.frame];
avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
[avPlayerLayer setNeedsLayout];
[embeddedView.layer addSublayer:avPlayerLayer];
[carousel.currentItemView addSubview:embeddedView];
//Assign to notication to check for end of playback
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:avPlayeritem];
[avPlayer seekToTime:kCMTimeZero];
[avPlayer play];

这是正在发生的事情的图像,因为您可以在顶部和底部分辨出来:

这是什么原因造成的,我该如何解决?

最佳答案

我认为视频没有填满 videoView 的完整边界是合乎逻辑的,因为您设置了 avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspect
你应该把它设置为 AVLayerVideoGravityResizeAspectFill ,它会没事的。

区别在于:

  • AVLayerVideoGravityResizeAspect - 显示与原始大小成比例的视频,并且不允许任何变形。
  • AVLayerVideoGravityResizeAspectFill - 调整视频大小,以填充其 subview 的完整边界,并且不关心比例。

  • 最后一件事,做 [avPlayerLayer setFrame:embeddedView.bounds] 它比 [avPlayerLayer setFrame:embeddedView.frame] 更好。

    希望这可以帮助 :)

    关于ios - AvPlayerLayer 大小不正确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25276602/

    10-12 14:46