首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确使用AVPlayer,使其在播放视频之前不显示白屏幕?

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

Stack Overflow用户
提问于 2015-04-29 05:50:42
回答 4查看 4.6K关注 0票数 5

每次,当我尝试使用AVPlayer播放一个兆字节的视频时,它最初会显示一个白色的屏幕,然后启动视频。

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

我试着用AVPlayerisReady来检查AVPlayer的状态,只在它准备好的时候播放视频,但是它仍然显示白色的屏幕。

而且,每次我试图获得即将通过AVPlayer播放的视频的持续时间时,我最初的播放时间为0.0秒,所以我也无法在视频中添加计时器,因为我无法获得视频的持续时间,因为它会在一秒钟内显示一个白色的屏幕。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-29 06:33:05

首先,AVPlayer不显示任何白色屏幕,它的背景是白色的。所以,基本上你的AVPlayer启动得很晚。我猜您按了一个UIButton,然后它在AVPlayer中加载文件,然后立即开始播放它。这就是问题所在。AVPlayer可能需要一些时间来缓冲足够的数据并准备好播放该文件。使用KVO时,可以通知玩家状态的更改。

因此,首先需要禁用play按钮,加载AVPlayer并添加一个观察者:

代码语言:javascript
运行
复制
play.enabled = NO;
player = [AVPlayer playerWithURL:URL];
[player addObserver:self forKeyPath:@"status" options:0 context:nil]; 

检查AVPlayerStatusReadyToPlay后启用它

代码语言:javascript
运行
复制
- (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;
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-06-20 14:32:19

我知道这是个老生常谈的问题,但即使在正确地检测到AVPlayer何时准备播放时,我也会遇到同样的问题。

我希望它能在图像上播放,这样在初始静态图像和移动视频之间就能顺利过渡。

对我来说,的诀窍是用以下内容设置一个清晰的背景:

代码语言:javascript
运行
复制
AVPlayerViewController *controller = [[AVPlayerViewController alloc] init];
[controller.view setBackgroundColor:[UIColor clearColor]];

这样的话,如果我在玩家准备玩的时候切换它的可见性,我就不会看到一个黑白屏幕,因为这个播放器有一个清晰的背景,为一个平稳的过渡!

票数 3
EN

Stack Overflow用户

发布于 2016-03-10 10:13:03

布兰科斯是对的。AVPlayer需要时间来实现状态AVPlayerStatusReadyToPlay。因此,使用url初始化播放机,并且只在它是AVPlayerStatusReadyToPlay时才播放它。

代码语言:javascript
运行
复制
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()  
        }  
    }  
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29935373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档