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

时间:2016-10-27 11:33:51

标签: ios objective-c video avfoundation 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];
        });
}

上面的方法在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];
        }
    }
}

问题是视图确实出现了,视频开始播放,但只播放音频,而不是视频。我得到的只是视频的黑屏。音频播放效果很好,但似乎不会因为某种原因而将视频帧渲染出来。

仅在iOS 10设备上发生这种情况,在iOS 9设备上运行相同的代码,就像魅力一样。视频按预期显示。

对于iOS 10的AVFoundation框架,在AVPlayer方面是否有任何改变?或者有什么我在这里缺少的,因为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);

6 个答案:

答案 0 :(得分:0)

您需要保留AVPlayerItem的实例,即作为属性或实例变量。如果您不保留对电影播放器​​的引用,则会丢失该参考。 甚至有一段时间,这种红宝石也会发生在ARC中。请将其作为财产。

答案 1 :(得分: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);

答案 2 :(得分:0)

黑色是AVPlayerViewController的背景色。所以将AVPlayerViewController的背景颜色更改为超视图颜色。因此黑色闪光灯将不可见。

   self.view.backgroundColor =[UIColor whiteColor];
   avMoviePlayer.view.backgroundColor=[UIColor whiteColor];
   [self.view addSubview:avMoviePlayer.view];

答案 3 :(得分:0)

在我的情况下,这个问题是因为我开始在动画块中同时与UIView.animateview.layoutIfNeeded()一起玩。

此问题的解决方法是在不需要时不对布局更改进行动画处理,而在开始播放视频时不对其进行动画处理。

答案 4 :(得分:0)

此页面上的解决方案不适用于我。

我找到了解决该问题的另一种方法。就我而言,视频以黑色播放,但声音还可以。

我发现更改时间滑块以擦洗视频会使视频显示。

所以,我的解决方案是将视频播放到最后一帧,然后播放到第一帧:

Float64 duration = [self.player duration];    
[self.player goToTime:duration];
[self.player goToTime:0.0f];

答案 5 :(得分:-1)

这是我最近为 AVPlayer

学习的内容

你可以尝试一下

XYAVMoviePlayer

享受你的一天:)