简体   繁体   English

当我使用 AVPlayerLayer 时,放大镜以错误的方式出现

[英]Magnifying glass appearing in a wrong way when I'm using AVPlayerLayer

I am using an AVPlayerLayer to play video in the background of my UIViewController instance.我正在使用 AVPlayerLayer 在我的 UIViewController 实例的背景中播放视频。 When I launched my app on the iPhone I noticed that magnifying glass appearing in a wrong way.当我在 iPhone 上启动我的应用程序时,我注意到放大镜以错误的方式出现。 Video specifications: H.264, AAC, 640x360, MOV.视频规格:H.264、AAC、640x360、MOV。

在此处输入图片说明

The background inside magnifying glass drawing without my video sublayer.没有我的视频子层的放大镜绘图中的背景。 Only subviews (buttons, text fields, etc.) are drawing inside my magnifying glass.只有子视图(按钮、文本字段等)在我的放大镜内绘制。

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor yellowColor];

    NSURL *videoURL = [[NSBundle mainBundle] URLForResource:@"bf4" withExtension:@"mov"];
    AVAsset *asset = [AVAsset assetWithURL:videoURL];
    AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:asset];
    AVPlayer *player = [AVPlayer playerWithPlayerItem:item];
    player.actionAtItemEnd = AVPlayerActionAtItemEndNone;

    UIView *container = [[UIView alloc] initWithFrame:self.view.bounds];
    container.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.view addSubview:container];

    AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:player];
    [container.layer addSublayer:layer];
    layer.frame = container.bounds;
    layer.videoGravity = AVLayerVideoGravityResizeAspectFill;

    [self.view bringSubviewToFront:self.textField];        
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [player play];
    });
}

Does anyone know how to prevent this?有谁知道如何防止这种情况?

The only one solution I figured out is to:我想出的唯一解决方案是:

  1. Put UIImageView below container view:UIImageView放在container视图下方:

     self.containerThumbnail = [[UIImageView alloc] initWithFrame:self.view.bounds]; self.containerThumbnail.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.containerThumbnail.backgroundColor = [UIColor clearColor]; [self.view insertSubview:self.containerThumbnail belowSubview:container];
  2. Become a time observer to the media player:成为媒体播放器的时间观察者:

     CMTime bgInterval = CMTimeMake(1, 10); __weak __typeof(self)weakSelf = self; [player addPeriodicTimeObserverForInterval:bgInterval queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) usingBlock:^(CMTime time) { [weakSelf locateThumbnail:time]; }];
  3. Put snapshots inside your UIImageView :将快照放在UIImageView

     - (void)locateThumbnail:(CMTime)time { __weak __typeof(self)weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) { CGImageRef imageRef = [weakSelf.imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL]; UIImage *image = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); __strong __typeof(weakSelf)strongSelf = weakSelf; dispatch_async(dispatch_get_main_queue(), ^(void) { strongSelf.containerThumbnail.image = image; }); }); }

The property imageGenerator is of type AVAssetImageGenerator :属性imageGeneratorAVAssetImageGenerator类型:

imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
imageGenerator.appliesPreferredTrackTransform = YES;

NB Snapshots updates in the background and because of this frames lag behind the video. NB 快照在后台更新,因此帧滞后于视频。 But this is better than nothing.但这总比没有好。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM