2016-07-25 53 views
0

我有一個AVPlayer與遠程視頻源。使用observeValueForKeyPath:ofObject:change:context:來檢測readyToPlay狀態,並將AVPlayerLayer設置爲myVideoContainerView的圖層進行顯示。AVPlayer與AVPlayerLayer'準備播放'狀態沒有工作的真正的視頻顯示屏

問題是:在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]; 
     } 
    } 
} 

回答

2

問題已解決。

不知道爲什麼,但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。應該以這種方式處理循環問題。

+0

很好。謝謝!!!! –

相關問題