每次,当我尝试使用AVPlayer
播放一个兆字节的视频时,它最初会显示一个白色的屏幕,然后启动视频。
如果视频已经被缓存,为什么会发生这种情况?有没有办法阻止这种情况发生,这样它就可以直接进入视频而不显示白色屏幕?
我试着用AVPlayer
的isReady
来检查AVPlayer
的状态,只在它准备好的时候播放视频,但是它仍然显示白色的屏幕。
而且,每次我试图获得即将通过AVPlayer
播放的视频的持续时间时,我最初的播放时间为0.0秒,所以我也无法在视频中添加计时器,因为我无法获得视频的持续时间,因为它会在一秒钟内显示一个白色的屏幕。
发布于 2015-04-29 06:33:05
首先,AVPlayer
不显示任何白色屏幕,它的背景是白色的。所以,基本上你的AVPlayer
启动得很晚。我猜您按了一个UIButton
,然后它在AVPlayer
中加载文件,然后立即开始播放它。这就是问题所在。AVPlayer
可能需要一些时间来缓冲足够的数据并准备好播放该文件。使用KVO时,可以通知玩家状态的更改。
因此,首先需要禁用play按钮,加载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;
}
}
}
发布于 2017-06-20 14:32:19
我知道这是个老生常谈的问题,但即使在正确地检测到AVPlayer何时准备播放时,我也会遇到同样的问题。
我希望它能在图像上播放,这样在初始静态图像和移动视频之间就能顺利过渡。
对我来说,的诀窍是用以下内容设置一个清晰的背景:
AVPlayerViewController *controller = [[AVPlayerViewController alloc] init];
[controller.view setBackgroundColor:[UIColor clearColor]];
这样的话,如果我在玩家准备玩的时候切换它的可见性,我就不会看到一个黑白屏幕,因为这个播放器有一个清晰的背景,为一个平稳的过渡!
发布于 2016-03-10 10:13:03
布兰科斯是对的。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()
}
}
}
https://stackoverflow.com/questions/29935373
复制相似问题