iOS 10 - AVPlayer 在播放视频时显示黑屏
iOS 10 - AVPlayer shows black screen when playing video
这里我有一个将视频层添加到我在 IB 中设置的 UIView 的方法:
-(void)loadPlayer{
self.asset = [AVAsset assetWithURL:url];
AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:self.asset];
self.player = [AVPlayer playerWithPlayerItem:item];
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
self.playerLayer.contentsGravity = AVLayerVideoGravityResizeAspect;
self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
item.videoComposition = [AVVideoComposition videoCompositionWithPropertiesOfAsset:self.asset];
[self.player pause];
[self.player addObserver:self forKeyPath:@"status" options:0 context:nil];
dispatch_async(dispatch_get_main_queue(), ^{
[self.videoLayer.layer addSublayer:self.playerLayer];
});
}
上述方法在视图控制器的 viewDidAppear 中被调用,因此每次加载当前视图控制器时,视频都应该开始播放。
这里我检查播放器状态并在准备好后播放资产:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if (object == self.player && [keyPath isEqualToString:@"status"]) {
if (self.player.status == AVPlayerStatusReadyToPlay) {
[self.player play];
}
}
}
问题是视图确实出现了,视频开始播放,但只有音频,没有视频。我得到的只是黑屏代替了视频。音频播放正常,但由于某种未知原因似乎无法渲染视频帧。
这只发生在 iOS 10 台设备上,当 运行 在 iOS 9 台设备上使用相同的代码时,效果非常好。视频按预期显示。
iOS10 的 AVFoundation 框架在 AVPlayer 方面有什么变化吗?或者我在这里遗漏了什么,因为 iOS 9 播放得很好。
如果有人遇到过这个问题,并且您已经解决了,请 post 您的解决方案。这会很有帮助。
谢谢。
解决方案
感谢您的回复!我刚刚发现,出于某种原因,在 iOS 10 中 viewDidLayoutSubviews
没有像在 iOS 9 中那样被调用。实际上我是在 [=14= 中设置播放器层的框架] 方法。因为它没有被调用,所以我无法在屏幕上看到播放器。我所做的是,在上面的 loadPlayer
方法中设置播放器层的框架。它工作正常。希望这对某人有所帮助。
这是我从 viewDidLayoutSubviews 移动到我的 loadPlayer 方法的代码行:
self.playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
您需要保留您的 AVPlayerItem 实例,即作为 属性 或实例变量。如果您不保留对电影播放器的引用,它就会丢失。
甚至有一段时间这种垃圾在 ARC 中发生,因为 well.Please 使它成为 属性.
下面是我最近研究的AVPlayer
你可以试试
祝你今天愉快:)
感谢您的回复!我刚刚发现,出于某种原因,在 iOS 10 中 viewDidLayoutSubviews
没有像在 iOS 9 中那样被调用。实际上我是在 viewDidLayoutSubviews
方法。因为它没有被调用,所以我无法在屏幕上看到播放器。我所做的是,在 loadPlayer
方法 above.And 中设置播放器层的框架它工作正常。谢谢!希望这对某人有所帮助。
编辑
这是我从 viewDidLayoutSubviews
移动到我的 loadPlayer
方法并且有效的代码行:
self.playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
黑色是AVPlayerViewController的背景色。所以将 AVPlayerViewController 的背景颜色更改为超级视图颜色。所以黑闪是看不到的。
self.view.backgroundColor =[UIColor whiteColor];
avMoviePlayer.view.backgroundColor=[UIColor whiteColor];
[self.view addSubview:avMoviePlayer.view];
在我的例子中,这个问题是因为我开始在动画块中同时播放 UIView.animate
和 view.layoutIfNeeded()
。
解决此问题的方法是在不需要时不为布局更改设置动画,并且在开始播放视频时不设置动画。
此页面上的解决方案对我不起作用。
我找到了解决这个问题的另一种方法。在我的情况下,视频以黑色播放,但声音还可以。
我发现更改时间滑块来擦除视频会使视频出现。
所以,我的解决方案是让视频播放到最后一帧,然后播放到第一帧:
Float64 duration = [self.player duration];
[self.player goToTime:duration];
[self.player goToTime:0.0f];
这里我有一个将视频层添加到我在 IB 中设置的 UIView 的方法:
-(void)loadPlayer{
self.asset = [AVAsset assetWithURL:url];
AVPlayerItem *item = [AVPlayerItem playerItemWithAsset:self.asset];
self.player = [AVPlayer playerWithPlayerItem:item];
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
self.playerLayer.contentsGravity = AVLayerVideoGravityResizeAspect;
self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
item.videoComposition = [AVVideoComposition videoCompositionWithPropertiesOfAsset:self.asset];
[self.player pause];
[self.player addObserver:self forKeyPath:@"status" options:0 context:nil];
dispatch_async(dispatch_get_main_queue(), ^{
[self.videoLayer.layer addSublayer:self.playerLayer];
});
}
上述方法在视图控制器的 viewDidAppear 中被调用,因此每次加载当前视图控制器时,视频都应该开始播放。
这里我检查播放器状态并在准备好后播放资产:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if (object == self.player && [keyPath isEqualToString:@"status"]) {
if (self.player.status == AVPlayerStatusReadyToPlay) {
[self.player play];
}
}
}
问题是视图确实出现了,视频开始播放,但只有音频,没有视频。我得到的只是黑屏代替了视频。音频播放正常,但由于某种未知原因似乎无法渲染视频帧。
这只发生在 iOS 10 台设备上,当 运行 在 iOS 9 台设备上使用相同的代码时,效果非常好。视频按预期显示。
iOS10 的 AVFoundation 框架在 AVPlayer 方面有什么变化吗?或者我在这里遗漏了什么,因为 iOS 9 播放得很好。
如果有人遇到过这个问题,并且您已经解决了,请 post 您的解决方案。这会很有帮助。
谢谢。
解决方案
感谢您的回复!我刚刚发现,出于某种原因,在 iOS 10 中 viewDidLayoutSubviews
没有像在 iOS 9 中那样被调用。实际上我是在 [=14= 中设置播放器层的框架] 方法。因为它没有被调用,所以我无法在屏幕上看到播放器。我所做的是,在上面的 loadPlayer
方法中设置播放器层的框架。它工作正常。希望这对某人有所帮助。
这是我从 viewDidLayoutSubviews 移动到我的 loadPlayer 方法的代码行:
self.playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
您需要保留您的 AVPlayerItem 实例,即作为 属性 或实例变量。如果您不保留对电影播放器的引用,它就会丢失。 甚至有一段时间这种垃圾在 ARC 中发生,因为 well.Please 使它成为 属性.
下面是我最近研究的AVPlayer
你可以试试
祝你今天愉快:)
感谢您的回复!我刚刚发现,出于某种原因,在 iOS 10 中 viewDidLayoutSubviews
没有像在 iOS 9 中那样被调用。实际上我是在 viewDidLayoutSubviews
方法。因为它没有被调用,所以我无法在屏幕上看到播放器。我所做的是,在 loadPlayer
方法 above.And 中设置播放器层的框架它工作正常。谢谢!希望这对某人有所帮助。
编辑
这是我从 viewDidLayoutSubviews
移动到我的 loadPlayer
方法并且有效的代码行:
self.playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
黑色是AVPlayerViewController的背景色。所以将 AVPlayerViewController 的背景颜色更改为超级视图颜色。所以黑闪是看不到的。
self.view.backgroundColor =[UIColor whiteColor];
avMoviePlayer.view.backgroundColor=[UIColor whiteColor];
[self.view addSubview:avMoviePlayer.view];
在我的例子中,这个问题是因为我开始在动画块中同时播放 UIView.animate
和 view.layoutIfNeeded()
。
解决此问题的方法是在不需要时不为布局更改设置动画,并且在开始播放视频时不设置动画。
此页面上的解决方案对我不起作用。
我找到了解决这个问题的另一种方法。在我的情况下,视频以黑色播放,但声音还可以。
我发现更改时间滑块来擦除视频会使视频出现。
所以,我的解决方案是让视频播放到最后一帧,然后播放到第一帧:
Float64 duration = [self.player duration];
[self.player goToTime:duration];
[self.player goToTime:0.0f];