我正在使用AVPlayerLayer在我的UIViewController实例的后台播放视频。当我在iPhone上启动我的应用程序时,我注意到放大镜以错误的方式出现。视频规格:H.264,AAC,640x360,MOV。
没有我的视频子层的放大镜绘图内的背景。只有子视图(按钮,文本字段等)在我的放大镜内绘制。
- (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];
});
}
有谁知道如何防止这种情况?
答案 0 :(得分:1)
我想出的唯一解决方案是:
在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];
成为玩家的时间观察者:
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];
}];
并在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;
});
});
}
属性imageGenerator
是AVAssetImageGenerator
实体:
imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
imageGenerator.appliesPreferredTrackTransform = YES;
快照在后台更新,因为这些帧落后于视频。但这总比没有好。