【发布时间】:2016-10-27 11:33:50
【问题描述】:
这里我有一个方法可以将视频层添加到我在 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);
【问题讨论】:
标签: ios objective-c video avfoundation avplayeritem