Aktualności Forum Graffiti Publicystyka Teleport
  • Niezbyt krótki kurs używania FFmpeg - część 1

17.03.2011 16:14, autor artykułu: Valwit
odsłon: 13509, powiększ obrazki, wersja do wydruku,

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.

    
komentarzy: 3ostatni: 17.11.2023 15:03
Na stronie SCENA.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem