这里我有一个方法将视频层添加到我在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];
});
}
上面的方法在View Controller的viewDidAppear中调用,因此每次加载当前的View Controller时,视频都应该开始播放。
在这里,我检查玩家状态并在准备好后播放资产:
- (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设备上运行时的代码相同,就像魅力一样。视频按预期显示。
对于iOS 10的AVFoundation框架,在AVPlayer方面有什么改变吗?或者有什么我在这里缺少,因为iOS 9播放它很好。
如果有人遇到过这个问题,如果你已经解决了,请发布你的解决方案。这会有所帮助。
谢谢。
- - ****解决方案**** - -
谢谢你的回复!我刚刚发现,出于某些原因,在iOS 10中,viewDidLayoutSubviews
没有被调用,因为它在iOS 9中。实际上我在viewDidLayoutSubviews
方法中设置了播放器层的帧。由于它没有被调用,我无法在屏幕上看到播放器。我做的是,在上面的loadPlayer
方法中设置播放器图层的帧。它工作正常。希望这有助于某人。
这是我从viewDidLayoutSubviews移动到我的loadPlayer方法的代码行,它工作正常:
self.playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
您需要保留AVPlayerItem的实例,即作为属性或实例变量。如果您不保留对电影播放器的引用,则会丢失该参考。甚至有一段时间,这种红宝石也会发生在ARC中。请将其作为财产。
黑色是AVPlayerViewController的背景色。所以将AVPlayerViewController的背景颜色更改为超视图颜色。因此黑色闪光灯将不可见。
self.view.backgroundColor =[UIColor whiteColor];
avMoviePlayer.view.backgroundColor=[UIColor whiteColor];
[self.view addSubview:avMoviePlayer.view];
谢谢你的回复!我刚刚发现,出于某些原因,在iOS 10中,viewDidLayoutSubviews
没有被调用,因为它在iOS 9中。实际上我在viewDidLayoutSubviews
方法中设置了播放器层的帧。由于它没有被调用,我无法在屏幕上看到播放器。我做的是,在上面的loadPlayer
方法中设置播放器图层的帧。它工作正常。谢谢!希望这有助于某人。
编辑
这是我从viewDidLayoutSubviews
移动到我的loadPlayer
方法的代码行,它工作正常:
self.playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
在我的情况下,这个问题是因为我开始在动画块中与UIView.animate
同时使用view.layoutIfNeeded()
。
解决这个问题的方法是在不需要时不为布局更改设置动画,在开始播放视频时不设置动画。