1

UIViewController インスタンスのバックグラウンドでビデオを再生するために AVPlayerLayer を使用しています。iPhone でアプリを起動したときに、虫眼鏡が間違った方法で表示されることに気付きました。動画仕様:H.264、AAC、640×360、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];
    });
}

これを防ぐ方法を知っている人はいますか?

4

1 に答える 1

1

私が考え出した唯一の解決策は次のとおりです。

  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];
    
  2. メディア プレーヤーのタイム オブザーバーになります。

     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. あなたの中にスナップショットを入れてください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;

NB スナップショットはバックグラウンドで更新されます。このため、フレームはビデオより遅れます。しかし、これは何もないよりはましです。

于 2015-08-03T19:12:00.320 に答える