如何正确使用 AVPlayer 使其在播放视频前不显示白屏?

How do I correctly use AVPlayer so it doesn't show white screen before playing video?

每次,当我尝试使用 AVPlayer 播放 MB 视频时,它最初会显示一秒钟的白屏,然后开始播放视频。

如果视频已经缓存,为什么会发生这种情况?有没有办法阻止这种情况的发生,让它直接进入视频而不显示白屏?

我试过使用AVPlayerisReady检查AVPlayer的状态,只在准备就绪时播放视频,但仍然显示白屏。

此外,每次当我尝试获取即将通过 AVPlayer 播放的视频的视频持续时间时,我最初总是得到 0.0 秒,所以我无法为视频添加计时器,因为我无法获取视频时长,因为它一直显示一秒钟的白屏。

首先,AVPlayer没有显示任何白屏,是你的背景是白色的。所以,基本上你的 AVPlayer 开始晚了。我猜你按下 UIButton 然后它加载 AVPlayer 中的文件并立即开始播放它。这就是问题所在。 AVPlayer 可能需要一些时间来缓冲足够的数据并准备好播放文件。使用KVO,可以通知播放器状态的变化。

所以首先你需要禁用播放按钮,加载AVPlayer并添加一个观察者:

play.enabled = NO;
player = [AVPlayer playerWithURL:URL];
[player addObserver:self forKeyPath:@"status" options:0 context:nil]; 

勾选后启用AVPlayerStatusReadyToPlay:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {
    if (object == player && [keyPath isEqualToString:@"status"]) {
        if (player.status == AVPlayerStatusReadyToPlay) {
            play.enabled = YES;
        }
    }
}

布兰科斯是对的。 AVPlayer 正在花时间实现 AVPlayerStatusReadyToPlay 状态。 所以,用 url 初始化播放器,只有当它是 AVPlayerStatusReadyToPlay.

时才播放它
player = [AVPlayer playerWithURL:URL];  
[player addObserver:self forKeyPath:@"status" options:0 context:nil];   

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

我遇到了同样的问题。为了避免添加 KVO,我只是在设置 url 时设置了 AVPlayer ...

var urlToUse: NSURL?
{
    didSet
    {
        guard let urlToUse = urlToUse else { return }
        replayPlayer = AVPlayer(URL: urlToUse)
    }
}

这样,AVPlayer 状态将在需要时准备就绪。

我知道这是一个老问题,但即使在正确检测 AVPlayer 何时可以播放时我也会遇到同样的问题。

我希望它在图像上播放,以便在初始静态图像和移动视频之间实现平滑过渡。

我的技巧 是设置清晰的背景:

AVPlayerViewController *controller = [[AVPlayerViewController alloc] init];
[controller.view setBackgroundColor:[UIColor clearColor]];

这样,如果我在准备播放时切换播放器的可见性,我就不会看到黑屏或白屏,因为播放器有清晰的背景,可以实现平滑过渡!