首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AvPlayerLayer的尺寸不对吗?

AvPlayerLayer的尺寸不对吗?
EN

Stack Overflow用户
提问于 2014-08-13 01:15:27
回答 2查看 5.6K关注 0票数 3

我有一个带有UIImageView的旋转木马对象,在这里我正在尝试subLayer AvPlayerLayer。

它的工作非常好,尽管它没有填满_videoView的全部边界--它的高度似乎更小,尽管我已经测试过将高度更改为极值,而且只要它与UIImageView重叠,它仍然处于这个大小。

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

代码语言:javascript
复制
    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];

下面是正在发生的事情的图像,您可以在顶部和底部区分它:

是什么导致了这一切,我该如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-13 12:25:21

我认为视频没有填满videoView的全部边界是逻辑的,因为您设置了avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspect。您应该将其设置为AVLayerVideoGravityResizeAspectFill,这样就可以了。

区别是:

  • AVLayerVideoGravityResizeAspect -显示与原始尺寸成比例的视频,不允许任何变形。
  • AVLayerVideoGravityResizeAspectFill --调整视频的大小,以填充其子视图的全部边界,而不关心相称性。

最后一件事,做[avPlayerLayer setFrame:embeddedView.bounds] --这比[avPlayerLayer setFrame:embeddedView.frame]好。

希望这会有所帮助:)

票数 6
EN

Stack Overflow用户

发布于 2019-04-29 09:34:40

接受的答案不能解决重复的、重叠的层的问题。相反,不要尝试addSublayer并创建一个AVPlayer支持视图:

斯威夫特

代码语言:javascript
复制
import UIKit
import AVFoundation

/// A simple `UIView` subclass that is backed by an `AVPlayerLayer` layer.
class PlayerView: UIView {
    var player: AVPlayer? {
        get {
            return playerLayer.player
        }

        set {
            playerLayer.player = newValue
        }
    }

    var playerLayer: AVPlayerLayer {
        return layer as! AVPlayerLayer
    }

    override class var layerClass: AnyClass {
        return AVPlayerLayer.self
    }
}

Objective-C

代码语言:javascript
复制
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface PlayerView : UIView
@property (nonatomic) AVPlayer *player;
@end

@implementation PlayerView
+ (Class)layerClass {
    return [AVPlayerLayer class];
}
- (AVPlayer*)player {
    return [(AVPlayerLayer *)[self layer] player];
}
- (void)setPlayer:(AVPlayer *)player {
    [(AVPlayerLayer *)[self layer] setPlayer:player];
}
@end

这样,图层将根据视图适当调整大小。

参考文献:

  1. 来自Apple的快速示例代码
  2. AVFoundation编程指南
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25276602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档