5

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

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

我尝试使用AVPlayer'sisReady检查状态AVPlayer并仅在视频准备好时播放视频,但它仍然显示白屏。

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

4

4 回答 4

4

首先,AVPlayer不显示任何白屏,它的背景是白色的。所以,基本上你AVPlayer的起步晚了。我猜你按 aUIButton然后它会加载文件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;
        }
    }
}
于 2015-04-29T06:33:05.787 回答
3

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

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

对我来说,诀窍是设置一个清晰的背景:

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

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

于 2017-06-20T14:32:19.360 回答
0

布兰科斯是对的。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()  
        }  
    }  
}
于 2016-03-10T10:13:03.053 回答
0

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

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

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

于 2016-07-18T16:22:50.363 回答