W moim odtwarzaczu wideo mam dziwną sytuację, której podstawowy kod nie zmienił się znacznie w porównaniu z wcześniejszą aplikacją. Oto problem: wstawiam "_loadingLayer" (CATextLayer, który mówi, że film się ładuje), a następnie obserwuję właściwość statusową odtwarzacza AVPlayer, aby dowiedzieć się, kiedy usunąć "_loadingLayer" i zastąpić ją moją aktualną "_playerLayer" . Oto mój kod KVO za to:AV Foundation: Różnica między bieżącym elementem, który jest gotowy do gry, a - właściwością [AVPlayer readyForDisplay]?
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ((object == _playerLayer) && (_playerLayer.player.currentItem.status == AVPlayerItemStatusReadyToPlay)) {
[CATransaction setAnimationDuration:1.8];
_loadingLayer.opaque = NO;
if (_playerLayer.readyForDisplay) {
NSLog(@"Should be ready now.");
}
[self addPlayerLayerToLayerTree];
}
}
Moim problemem jest to, że film zaczyna, ale tylko dźwięk jest odtwarzany - warstwa pozostaje czarny. Kiedy wstawiłem powyższą instrukcję NSLog, dowiedziałem się dlaczego: Podobno chociaż status currentItem to "AVPlayerItemStatusReadyToPlay", warstwa odtwarzacza nie jest tak naprawdę readyForDisplay. To nie ma dla mnie sensu - wydaje się sprzeczne z intuicją. Czy ktoś może mi dać jakieś wskazówki na ten temat?
Udało mi się zweryfikować, że _playerLayer jest dodawany do drzewa warstw, ustawiając kolor jego tła na czerwony.
Innym dziwne, że myślę, że może być związane .... Byłem widząc te komunikaty w konsoli debuggera:
PSsetwindowlevel, błąd ustawiania poziomu okna (1000) CGSSetIgnoresCycle: Błąd 1000 lub ustawienie czyszczenie znaczników okna
Z góry dziękuję. To jest crosspost z forum Apple Dev.