FFmpeg to narzędzie o ogromnych możliwościach. W tym artykule, poza samym wyjaśnieniem jak go używać, chciałbym napisać nieco dlaczego, po co i czemu FFmpeg właściwie służy. Dodatkowo chciałbym na wstępie zaznaczyć, że będę starał się pisać tak, aby był z tego pożytek niezależnie od używanej platformy sprzętowej.
Czym jest FFmpeg?
W skrócie: FFmpeg to pakiet programów służących do odtwarzania, zapisywania i konwersji wielu różnych formatów i kodeków audio i wideo. Szerzej: FFmpeg powstał pod Linuksem, jako odpowiednik wielu różnych konwerterów i drobnych edytorów plików AV dostępnych na innych platformach (głównie oczywiście Windows). W typowo linuksowy sposób łączy on jednak funkcjonalność wielu różnych narzędzi w jednym małym pakiecie, składającym się, w podstawowej wersji, z kilku zaledwie plików:
ffmpeg - konsolowy konwerter pozwalający również (w miarę możliwości systemu) na zrzut i konwersje w czasie rzeczywistym materiału z karty TV czy DVB.
libavcodec i libavformat - jak nazwy wskazują, są to biblioteki zawierające opisy kodeków i formatów zapisu dla obrazu i dźwięku. Obsługa kodeków i formatów jest pisana od podstaw, co z jednej strony pozwala na daleko idącą optymalizację kodu i wiąże się z wysoką wydajnością. Z drugiej niestety powoduje, że w wielu krajach pojawiają się problemy prawne z powodu licencji na niektóre kodeki czy formaty lub sposoby szyfrowania. Dlatego wiele dystrybucji zawiera okrojone wersje tych bibliotek, obsługujące zaledwie kilka formatów i kodeków z kilkudziesięciu dostępnych w pełnej wersji.
Poza podstawowymi składnikami jest jeszcze kilka programów i bibliotek umożliwiających bezpośrednie odtwarzanie plików, streaming, postprocessing, wydajniejsze skalowanie czy obsługę różnych algorytmów sum kontrolnych. Nie wszystkie te elementy są jednak dostępne na każdej z platform, dla której dostępny jest FFmpeg. A lista tych platform jest pokaźna. W międzyczasie FFmpeg wraz z przybytkami został przeportowany na systemy AmigaOS, MorphOS, Solaris, Windows, MacOS, różne odmiany BSD, PalmOS, Windows Mobile i kilka innych egzotycznych, jak np. TOS. Działa na procesorach 68k, x86, PPC, ARM, Alpha, w 16, 32 czy 64 bitach. Jest też podstawą takich programów/pakietów jak MPlayer, ffdshow, VDR, Xine czy VideoLAN oraz słynne TCPMP dla PalmOS i WM.
Co to robi?
FFmpeg pozwala na konwersję praktycznie każdego używanego obecnie formatu AV na inny. Chcesz oglądać filmiki z YouTube na swoim telefonie komórkowym? A może filmik z aparatu chcesz obejrzeć na Efice? Albo zrobić z niego DVD, albo przekonwertować zbiór obrazków w filmik, a ten jako FLV wrzucić na stronę czy YouTube? A może chcesz pomniejszyć rozmiar pliku, zmienić jego jakość czy rozdzielczość, zmienić kodek dźwięku czy obrazu, aby obejrzeć sobie film na słabszym sprzętowo urządzeniu? Wszystko to potrafi zrobić FFmpeg i nie potrzebuje do tego nic poza tym, co dostajesz w pakiecie i kawałkiem konsoli. Dzięki temu, że jest dostępny na wiele platform i systemów, nie musisz zapamiętywać różnych komend i narzędzi na różnych platformach. Jeden FFmpeg wystarcza, a dzięki konsoli można go używać bez problemu na zdalnej maszynie.
Jak to robi?
W zależności od tego, co każemy zrobić, FFmpeg za pomocą swoich bibliotek rozpoznaje - czym jest plik wejściowy, następnie dekoduje zawartość i przetwarza ją w pożądany przez nas sposób, a następnie zapisuje w docelowym formacie. Aby lepiej zrozumieć co się dzieje, najpierw powinniśmy sobie wyjaśnić - czym jest kodek, a czym kontener oraz jak są ze sobą powiązane.
Kodek można opisać jako rodzaj kompresji, odpowiednik algorytmu LZSS, którym pakuje LhA, czy DEFLATE użyty w ZIP. W przeciwieństwie do zwykłego archiwizera musi on jednak pozwalać na ekstrakcję danych w czasie rzeczywistym. LhA czy ZIP najpierw wymagałyby rozpakowania całości, co w przypadku filmu byłoby bez sensu. Prosty kodek, jak np. MJPEG, po prostu zapisuje każdą klatkę filmu jako obrazek JPEG. Bardziej skomplikowane kodeki, typu MPEG czy XviD, dodatkowo analizują zawartość klatek i po zapisaniu pełnej klatki kilka kolejnych zawiera jedynie zmiany w stosunku do zapisanej pełnej klatki. Czyli zamiast 10 czy 100 obrazków mamy jeden i listę zmian, zajmującą dla tych 10 czy 100 klatek jedynie ułamek pierwotnej wielkości. Jest to opis bardzo uproszczony, gdyż cały dowcip polega na sposobie, w jaki zmiany są opisywane, ile ich jest opisywanych i co w ogóle jest zmianą. Z dźwiękiem sprawa wygląda bardzo podobnie, a zainteresowanych detalami odsyłam w tym miejscu do Wikipedii.
Kontener to struktura, której zawartość, skompresowana kodekiem, jest "poukładana" w ściśle określony sposób, przy czym zawartością mogą być w tym wypadku obrazy, dźwięki czy dodatkowe dane. Wracając do przykładu z poprzedniego akapitu, kontenerem byłby plik LhA, ZIP czy 7z. W najprostszych wypadkach kontener określa jedynie, że zawiera obraz i dźwięk, w bardziej skomplikowanych definiuje, że strumień zawiera na przemian jedną klatkę obrazu i jedną ramkę dźwięku, a dodatkowe napisy są na końcu pliku lub nie ma ich wcale i program odtwarzający musi je pobrać z zewnętrznego pliku. Bywa, że jest kilka strumieni dźwięku czy obrazu równolegle i wtedy format kontenera definiuje, co jest gdzie. Głównym zadaniem kontenera jest uporządkowanie całości, aby odtwarzacz miał ciągły strumień danych. Jest to o tyle istotne, że w przypadku skomplikowanych kodeków, jak np. XviD, nie jest możliwe odtworzenie obrazu w dowolnym miejscu a jedynie od zapisanej pełnej klatki (tzw. key-frame - klatka kluczowa). Jeśli kodujący się nie postarał i umieścił te klatki w dużych odstępach czasowych, to co prawda oszczędził miejsca, ale przy przewijaniu będziemy mogli jedynie skakać co spore odcinki albo aż do następnej key-frame będziemy oglądać czarny obraz lub śmieci na ekranie.
Najpopularniejszymi kontenerami są obecnie AVI i MKV oraz MPEG. Amigowym, uniwersalnym kontenerem jest IFF mogący zawierać obraz, dźwięk, tekst czy inne dane. Jednak nie jest zbyt popularny poza Amigą i możemy go tu pominąć, mimo że FFmpeg jest w stanie go odczytać. AVI zawiera obraz i dźwięk, a MKV może dodatkowo zawierać dane dodatkowe jak skany okładek, napisy oraz kilka ścieżek dźwięku czy obrazu. W przypadku MPEG sprawa się komplikuje, gdyż mamy tu do czynienia z różnymi kontenerami i kodekami, przy czym każdy dodatkowo ma kilka odmian i wersji. Ponadto istnieje sporo innych formatów jak choćby FlashVideo (FLV) czy różne odmiany RealMedia (RM), czy QuickTime (QT, MOV). Na szczęście wszystko to załatwia za nas FFmpeg i tylko w niektórych przypadkach musimy pomyśleć czy wystarczy zmienić sam kodek, czy dodatkowo musimy też zmieniać kontener. Zajmiemy się tym jednak w dalszych częściach. Wszelkie uwagi, zapytania i sugestie proszę kierować pod adres amiga@valwit.net
Odnośniki
http://ffmpeg.org - strona główna projektu FFmpeg
http://fabportnawak.free.fr/misc - wersja dla systemu MorphOS
http://ffmpeg.arrozcru.org/autobuilds - jedna z wielu stron z wersją dla Windows
http://ffmpeg.darwinports.com - wersja dla MacOS
Dla AmigaOS 3.x i 4.x proponuję zerknąć na PPA lub inny portal amigowy, ewentualnie Aminet lub OS4Depot. Dostępne są różne wersje kompilowane pod konkretne systemy.
Użytkownicy openSUSE znajdą FFmpeg w repozytorium "Packman", w innych dystrybucjach zazwyczaj wystarczy poszukać odpowiedniej paczki systemowym menadżerem oprogramowania.
Artykuł oryginalnie pojawił się w drugim numerze Polskiego Pisma Amigowego.