如何正确使用 AVPlayer 使其在播放视频前不显示白屏?
How do I correctly use AVPlayer so it doesn't show white screen before playing video?
每次,当我尝试使用 AVPlayer
播放 MB 视频时,它最初会显示一秒钟的白屏,然后开始播放视频。
如果视频已经缓存,为什么会发生这种情况?有没有办法阻止这种情况的发生,让它直接进入视频而不显示白屏?
我试过使用AVPlayer
的isReady
检查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]];
这样,如果我在准备播放时切换播放器的可见性,我就不会看到黑屏或白屏,因为播放器有清晰的背景,可以实现平滑过渡!
每次,当我尝试使用 AVPlayer
播放 MB 视频时,它最初会显示一秒钟的白屏,然后开始播放视频。
如果视频已经缓存,为什么会发生这种情况?有没有办法阻止这种情况的发生,让它直接进入视频而不显示白屏?
我试过使用AVPlayer
的isReady
检查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]];
这样,如果我在准备播放时切换播放器的可见性,我就不会看到黑屏或白屏,因为播放器有清晰的背景,可以实现平滑过渡!