iOS 10-AVPlayer在播放视频时显示黑屏

bad*_*esh 5 video objective-c avfoundation ios avplayeritem

在这里,我有一种将视频层添加到我在IB中设置的UIView的方法:

 -(void)loadPlayer{
        self.asset = [AVAsset assetWithURL:url];

        AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:self.asset];

        self.player = [AVPlayer playerWithPlayerItem:item];
        self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
        self.playerLayer.contentsGravity = AVLayerVideoGravityResizeAspect;
        self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;

        item.videoComposition = [AVVideoComposition videoCompositionWithPropertiesOfAsset:self.asset];

        [self.player pause];
        [self.player addObserver:self forKeyPath:@"status" options:0 context:nil];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.videoLayer.layer addSublayer:self.playerLayer];
        });
}
Run Code Online (Sandbox Code Playgroud)

在View Controller的viewDidAppear中调用上述方法,因此,每次加载当前View Controller时,视频都应开始播放。

在这里,我检查玩家状态并准备好资产:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {
    if (object == self.player && [keyPath isEqualToString:@"status"]) {
        if (self.player.status == AVPlayerStatusReadyToPlay) {
            [self.player play];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题在于视图确实出现了,视频开始播放,但仅播放音频,而不播放视频。我得到的只是黑屏代替了视频。音频可以正常播放,但是由于未知原因,它似乎无法渲染视频帧。

这仅在iOS 10设备上发生,在iOS 9设备上运行时使用相同的代码,就像是超级按钮。该视频按预期显示。

就AVPlayer而言,iOS 10的AVFoundation框架是否有任何更改?还是我在这里缺少任何内容,因为iOS 9表现不错。

如果有人遇到此问题,并且已经解决,请发布解决方案。这将是有帮助的。

谢谢。

- - ****解决方案**** - -

多谢您的回覆!我刚刚发现,由于某种原因,在iOS 10中viewDidLayoutSubviews并未像在iOS 9中那样被调用。实际上,我在方法中设置了播放器层的框架viewDidLayoutSubviews。由于未调用,因此无法在屏幕上看到播放器。我所做的是,按照上述loadPlayer方法设置播放器层的框架。而且效果很好。希望这对某人有帮助。

这是我从viewDidLayoutSubviews移动到我的loadPlayer方法的代码行,并且有效:

self.playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
Run Code Online (Sandbox Code Playgroud)

bad*_*esh 0

感谢您的回复!我刚刚发现,由于某种原因,在 iOS 10 中,它viewDidLayoutSubviews没有像在 iOS 9 中那样被调用。实际上,我是在方法中设置播放器层的框架viewDidLayoutSubviews。由于它没有被调用,我无法在屏幕上看到播放器。我所做的是,在上面的方法中设置播放器图层的框架。并且loadPlayer效果很好。谢谢!希望这对某人有帮助。

编辑

viewDidLayoutSubviews这是我从我的方法中移出的代码行loadPlayer,它起作用了:

self.playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);