【问题标题】:iOS 10 - AVPlayer shows black screen when playing videoiOS 10 - AVPlayer 在播放视频时显示黑屏
【发布时间】:2016-10-27 11:33:50
【问题描述】:

这里我有一个方法可以将视频层添加到我在 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);

【问题讨论】:

    标签: ios objective-c video avfoundation avplayeritem


    【解决方案1】:

    您需要保留您的 AVPlayerItem 实例,即作为属性或实例变量。如果您不保留对电影播放器​​的引用,它就会丢失。 甚至有时这种垃圾也发生在 ARC 中。请使其成为财产。

    【讨论】:

    • 我有同样的错误,但我不确定它会帮助你。道歉
    • 谢谢,Matloob。在找到解决方案之前,我尝试将其更改为属性。没用。请尝试我的答案,看看它是否有效。
    【解决方案2】:

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

    解决方法是在不需要时不为布局更改设置动画,并且在开始播放视频时不设置动画。

    【讨论】:

      【解决方案3】:

      此页面上的解决方案对我不起作用。

      我找到了解决此问题的另一种方法。在我的情况下,视频以黑色播放,但声音还可以。

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 谢谢!我得到了解决方案。请检查我的答案。
        【解决方案5】:

        感谢您的回复!我刚刚发现,由于某种原因,在 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】:

        这是我最近为 AVPlayer

        研究的内容

        你可以试试

        XYAVMoviePlayer

        享受你的一天:)

        【讨论】:

        • 对您提供链接的原因提出意见和评论会很有用
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多