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.

hej, sprawdzales moze jakie ustawienia powoduja najmniejsze obciazenie dla procesora? chodzi o to, zeby odtwarzac pelnoekranowe video na wolniejszym komputerze. flash wydaje sie byc pod tym wzgledem bardzo zasobozerny w porownaniu np do mplayera.
pozdrowienia, daniel
Tutaj trzeba by rozróżnić dwie sprawy. Po pierwsze obciążenie procesora związane z dekodowaniem, po drugie obciążenie związane z wyświetlaniem. Jeżeli wyświetlamy na fullscreenie, to ustawiamy Video.smoothing = false;. To pozwoli na sprzętową optymalizację wyświetlania. Obciążenie związane z dekodowaniem zależy przede wszystkim od profilu jaki wybierzemy. Profil baseline nadaje się do urządzeń mobilnych, ale chyba nie musimy mierzyć tak nisko. Profil high jest zalecany ze względu na bardzo dobrą jakość, ale obciąża znacznie procesor. Najlepiej nada się więc profil main. Należy jednak pamiętać, że jest to główny parametr decydujący o jakości, więc różnica będzie widoczna gołym okiem.
Taka uwaga, przy ustawieniu avc level 4.1 adobe media encoder w nie daje strumienia zgodnego ze specyfikacją tego levela – miałem okazję przepuścić kilka sampli przez weryfikator Sony’ego i wyrzucił mi mnóstwo błędów głównie związanych z brakiem slice’ów – jest to generalnie problem enkoderów opartych na silniku Main Concept – więc może się okazać że niektóre urządzenia mogą mieć z takim strumieniem problemy.
2-3 Mb na 1080p25/i50 to dosyć mało (co zresztą widać na przykładowych wideo zamieszczonych w poście). Na potrzeby Internetu można przyjąć 4-6 Mb/s, choć tak naprawdę sensowna jakość zaczyna się dopiero ok. 10 Mb/s. Brakuje mi też informacji o fps docelowych materiałów: jeżeli mówimy o 50p (czyli standardzie telewizyjnym, a nie spotykanym dość często w sieci 25p), to 1.5Mb/s dla 720p też będzie dosyć mało.
Jeżeli decydujemy się na umieszczenie materiałów w jakości HD, warto by rzeczywiście tą jakość przedstawiały.
Witam. Proszę o radę. Nagrywam sobie filmy z HD na prywatny użytek.
Mam np “Opór” nagrany w 1920×1080 z bitrate 8MB/s. Chce go przekodować do 1280×720. Jakie powinienem ustawić bitrate przy kodowaniu i jaki najlepiej wybrać format kompresji?
Dziękuję i pozdrawiam.