Począwszy od wersji 9.0.r115 Flash Player ma wbudowaną obsługę formatu video H.264. W chwili obecnej taką lub nowszą wersję playera posiada 90% internautów. Czas więc najwyższy przyjrzeć się temu formatowi bliżej i postarać się wykorzystać jak najbardziej jego możliwości. Nie jest to zadanie łatwe, gdyż liczba parametrów jakie oferuje może przyprawić o ból głowy. Na początek trochę teorii. Poniżej schemat blokowy kodeka H.264:

Schemat blokowy kodeka H.264
Ok, darujmy sobie teorię.
Oto lista podstawowych parametrów z ich krótkim opisem oraz optymalnymi wartościami (nazwy parametrów mogą być różne w różnych programach).
- Profile (określa technikę i strategię używaną przez koder oraz dekoder, co wpływa na wymaganą moc obliczeniową): High
- Level (określa maksymalną rozdzielczość, wymaganą pamięć, lokalny bitrate, oraz poziom buforowania): 4.1 (5.1 dla Full HD)
- Constant Bitrate – korzystne przy streamingu
- Variable Bitrate – korzystne przy progressive download
- Multi-pass encoding – kiedy tylko to możliwe używamy 2-pass encoding
- IDR Interval (odległość pomiędzy klatkami kluczowymi – key frames distance): 50 – 250
- Dynamic IDR positioning (dynamiczne umieszczanie klatek kluczowych zdeterminowane detekcją scen): 40 – 50
- B-frames (lub B-pictures – klatki interpolowane na podstawie klatek poprzednich oraz następnych; nie są referencją dla innych klatek; wartość parametru określa ich maksymalną występującą po sobie ilość; kiedy koder to umożliwia, rekomenduje się użycie “auto decision”): 1 – 3
- B-pyramid (umożliwia kiedy to konieczne użycie B-frames jako klatek referencyjnych): włączyć jeżeli jest dostępne
- Entropy coding (kodowanie entropijne binarnego strumienia obrazu): jeżeli to możliwe używamy CABAC zamiast CAVLC
- Search mode (technika szukania wukorzystywana w estymacji ruchu): hexagonal
- Search accuracy: quarter-pixel
- Number of reference frames: 2 – 5
- Intra frame prediction: należy używać Hadamard transform
- Rate distortion optimization (optymalizuje estymację ruchu, jednak może znaczenie spowolnić przetwarzanie i niewiele poprawić jakość): complex
- De-blocking (filtr – jeden z głównych powodów wysokiej wydajności kodeka H.264; nigdy nie należy go wyłączać): pozostawić wartości standardowe
Zastosowanie powyższych parametrów powoduje jednak znaczne wydłużenie czasu kodowania (nawet kilkukrotnie w stosunku do czasu trwania filmu). Oto lista parametrów oraz wartości jakie można im przypisać, żeby skrócić czas i jednocześnie nie stracić zbyt wiele na jakości:
- reference frames: 2
- zablokować B-pyramid
- zmniejszyć search range (np. do 16 lub do simple) oraz search mode
- zmniejszyć search accuracy do half-pixel
- zablokować rate distortion optimizations (RDO)
- rozważyć zmniejszenie rozdzielczości lub zastosować pre-filtering
W takim razie do dzieła. Pod nóż poszły trzy programy: MediaCoder, MainConcept Reference, Adobe Media Encoder CS4 oraz 42 sekundowy film w jakości Full HD (1080i). Żeby dostrzec pogorszenie jakości, narzuciłem dość rygorystyczne warunki: docelowa rozdzielczość 720×400 oraz bitrate video 300kbps.
Niestety w MediaConcept Reference nie udało mi się wyprodukować filmu z dźwiękiem w formacie AAC, więc odpadł w zasadzie w przedbiegach. Nie jest to jednak dużą stratą, gdyż Adobe Media Encoder opiera się na kodeku opracowanym właśnie przez firmę MediaConcept. Tak więc poniżej porównanie klipów pochodzących z dwóch pozostałych programów.
Przykład 1: Media Coder
Przykład 2: Adobe Media Encoder CS4
MediaCoder wygrywa w tej konkurencji, choć oba programy wymagają przetestowania kompresji na filmach o innym tempie akcji (częste zmiany scen, dużo ruchu i szczegółów). Jakość obu filmów jest jednak i tak bardzo zadowalająca. Biorąc pod uwagę poprzedni kodek (On2vp6) otrzymujemy o wiele lepszą jakość przy niższym bitrate i cztery razy większej rozdzielczości (biorąc pod uwagę powierzchnię).
Kilka porad nie do końca związanych z kodekiem:
- Wybierz odpowiedni bitrate do zadanej rozdzielczości; oto zalecane wartości:
- 1080p: Full HD (1920×1080) 2 – 3 Mbps
- 720p HD (1280×720): 1.5 – 2 Mbps
- 576p HQ (1024×576): 1 – 1.2 Mbps
- 480p SD (848×480): 0.8 – 1 Mbps
- 360p MD (640×360): 0.6 – 0.8 Mbps - Rozważ kodowanie w rozdzielczości anamorficznej (np. 1440 x 1080 zamiast 1920 x 1080 i późniejsze rozciągnięcie obrazu we flashu – wg standardu dalej będzie to obraz Full HD)
- Odszum video przed zakodowaniem (”temporal denoise filter”, “3D denoise filter”). Skalowanie również działa jako filtr odszumiający, o ile jest to skalowanie bilinear lub bicubic.
- Jeżeli film źródłowy jest nagrany z przeplotem i nie posiadasz zaawansowanego programu do jego usuwania, spróbuj zakodować obraz w dwukrotnie niższej rozdzielczości pionowej i rozciągnij go we Flashu.
- Jeżeli rozciągasz film we Flashu używaj video.smoothing=true. Pamiętaj, aby wyłączyć smoothing przy wchodzeniu w tryb fullscreen, aby uaktywnić akcelerację sprzętową.
- Jeżeli kodujesz w niskiej jakości, można użyć we Flashu prostego sharpen filter w celu wyostrzenia szczegółów.
Na koniec jeszcze dwa przykłady przygotowane za pomocą MediaCoder pokazujące możliwości formatu H.264. Pierwszy z nich to fragment filmu w rozdzielczości HD (720p: 1280 x 720) i jakości 1Mbps: http://woszkowski.com/h264/pb-hd-1000.html. Drugi to film w rozdzielczości Full HD (1080p: 1920 x 1080) i jakości 1.5Mbps: http://woszkowski.com/h264/pb-fhd-1500.html. W obu przypadkach polecam przełączenie do trybu fullscreen przyciskiem w lewym górnym rogu filmu.
Na podstawie sesji “Encoding Video for the Highest Quality and Performance”, Fabio Sonnati, Adobe MAX 2008, Milan.


Ostatnie komentarze