具有 AVPlayerLayer 'ready to play' 状态的 AVPlayer 无法用于真正的 videoView 显示
AVPlayer with AVPlayerLayer 'ready to play' status no work for the real videoView display
我有一个带远程视频源的 AVPlayer。使用 observeValueForKeyPath:ofObject:change:context:
检测 readyToPlay
状态是否打开并将 AVPlayerLayer 设置为 myVideoContainerView 的层进行显示。
问题是:readyToPlay
状态触发后。实际显示在屏幕上的视频延迟 1-2 秒。
我曾尝试在 readyToPlay
状态开启前后设置 AVPlayerLayer。但没有一个有效。
只有在我使用 AVPlayer+AVPlayerLayer
时才会出现此问题。使用 AVPlayerViewController
没问题。但我仍然需要在我的项目中解决这个问题。
感谢任何建议!
@property (weak, nonatomic) IBOutlet UIView *myVideoContainter;
@property AVPlayer *player;
@property AVPlayerLayer *layer;
-(void)viewDidLoad{
self.player = [AVPlayer playerWithUR:videoURL];
[self.player addObserver:self forKeyPath:@"status" options:0 context:nil];
}
- (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) {
NSLog(@"Ready To Play");
self.layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
self.layer.frame = self.mainContentView.bounds;
[self.mainContentView.layer addSublayer:self.layer];
}
}
}
问题已解决。
不知道为什么 player.currentItem.status
比 player.status
更准确。
[self.player.currentItem addObserver:self forKeyPath:@"status" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if(self.player.currentItem.status == AVPlayerItemStatusReadyToPlay){
//do something
}
}
注意。某些操作会改变 AVPlayerItem.status
。应该这样处理循环问题。
我有一个带远程视频源的 AVPlayer。使用 observeValueForKeyPath:ofObject:change:context:
检测 readyToPlay
状态是否打开并将 AVPlayerLayer 设置为 myVideoContainerView 的层进行显示。
问题是:readyToPlay
状态触发后。实际显示在屏幕上的视频延迟 1-2 秒。
我曾尝试在 readyToPlay
状态开启前后设置 AVPlayerLayer。但没有一个有效。
只有在我使用 AVPlayer+AVPlayerLayer
时才会出现此问题。使用 AVPlayerViewController
没问题。但我仍然需要在我的项目中解决这个问题。
感谢任何建议!
@property (weak, nonatomic) IBOutlet UIView *myVideoContainter;
@property AVPlayer *player;
@property AVPlayerLayer *layer;
-(void)viewDidLoad{
self.player = [AVPlayer playerWithUR:videoURL];
[self.player addObserver:self forKeyPath:@"status" options:0 context:nil];
}
- (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) {
NSLog(@"Ready To Play");
self.layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
self.layer.frame = self.mainContentView.bounds;
[self.mainContentView.layer addSublayer:self.layer];
}
}
}
问题已解决。
不知道为什么 player.currentItem.status
比 player.status
更准确。
[self.player.currentItem addObserver:self forKeyPath:@"status" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if(self.player.currentItem.status == AVPlayerItemStatusReadyToPlay){
//do something
}
}
注意。某些操作会改变 AVPlayerItem.status
。应该这样处理循环问题。