2012-03-23 8 views
8

Obecnie tworzę odtwarzacz wideo do strumieniowej zawartości przy użyciu AVPlayer Framework. Natknąłem się na właściwość VideoGravity String-AVPlayerLayer, która pozwoli ustawić tryb skalowania/zmiany rozmiaru odtwarzacza na różne wartości.Ustawienie AVPlayerLayer VideoGravity działa na Simulatorze, a nie na iPadzie.

W celu zapewnienia użytkownikowi znanych z domyślnym odtwarzaczem skalowania i funkcji, jakie utworzone metodę, która będzie wykonać następujący kod:

AVPlayerLayer *layer = (AVPlayerLayer *)[self.videoContainer layer]; 

if([layer.videoGravity isEqualToString:AVLayerVideoGravityResizeAspect]) 
    layer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
else 
    layer.videoGravity = AVLayerVideoGravityResizeAspect; 

To działa bardzo dobrze w symulatorze, ale jakoś nie na moim iPadzie 2 z zainstalowanym iOS 5.0.1.

Czy ktoś miał podobne problemy? Czy jest to znany błąd systemu iOS w wersji 5.0.1? Czy istnieje lepsze podejście do wdrażania skalowania/zmiany rozmiaru za pomocą AVPlayerLayer?

Wszelkie pomysły/tips/help i zalecenia są bardzo cenione,

Dzięki

Sam

+0

Kiedy mówisz, że to nie działa na prawdziwym urządzeniu, co się właściwie dzieje? Nic lub jakieś inne nieoczekiwane zachowanie? – reddersky

+0

Niestety nic się nie dzieje (jeśli widzę) ... jeśli zrobię NSLog (layer.videoGravity) zwrócony zostanie "poprawny" ciąg VideoGravity. Akceptuje również zmiany w nim, ale tak naprawdę nie zmienia rozmiaru treści filmu ... – samsam

+0

Mogę tu wyskakiwać z niewłaściwego drzewa, ale dlaczego ustawiasz wideoGravity na ciąg stałej nazwy zamiast ustawiania do samej stałej? – reddersky

Odpowiedz

20

Ustawienie granic będzie wewnętrznie setNeedsLayout. Musisz to nazwać sobą, jeśli zmienisz tylko grawitację. Zadzwonienie do setNeedsDisplay, aby wymusić ponowne losowanie, również nie zaszkodzi, chociaż wyobrażam sobie, że AVPlayerLayer aktualizuje zawartość warstwy tak często, że nie będzie to miało znaczenia.

EDYCJA: Twoje imię jest dwa razy lepsze od mojego!

+1

Nie mogłem wykonać tego zadania dla mnie i okazało się, że problem dotyczy błędu w iOS 5.0 i 5.0.1. Jeśli ktoś inny natknie się na to i potrzebuje rozwiązania, sprawdź: http://stackoverflow.com/questions/8918105/animate-avplayerlayer-videogravity-property –

4

końcu udało mi się naprawić mój problem wymieniając powyższe stwierdzenie z następujących ...

if (self.player.status == AVPlayerStatusReadyToPlay) { 
    if([((AVPlayerLayer *)[self.videoContainer layer]).videoGravity isEqualToString:AVLayerVideoGravityResizeAspect]) 
     ((AVPlayerLayer *)[self.videoContainer layer]).videoGravity = AVLayerVideoGravityResizeAspectFill; 
    else 
     ((AVPlayerLayer *)[self.videoContainer layer]).videoGravity = AVLayerVideoGravityResizeAspect; 

    ((AVPlayerLayer *)[self.videoContainer layer]).bounds = ((AVPlayerLayer *)[self.videoContainer layer]).bounds; 
} 

ustawienie granic AVPlayerLayer na granicę AVPlayerLayer wydawało się działać. chociaż tak naprawdę nie rozumiem dlaczego.

jednak: hurra dla rozwiązania roboczego.

+1

Zobacz także pytanie [Animate AVPlayerLayer videoGrawitacja] (http://stackoverflow.com/a/10489823/21698) pytanie o rozwiązanie, które ożywia zmiana grawitacji wideo w systemie iOS 5.0.1. – 0xced