FFmpeg – świetna propozycja dla wideohobbystów
Nie znalazłem w internecie sensownej konstatacji na temat FFmpeg. Na razie po prostu go poznaj.
Panie i Panowie
Przedstawiam Wam moje narzędzie do edycji wideo, które w znacznym stopniu dało mi konstruktywnego kopa do poznawania Linuksa. Dotychczas wydawało mi się, że nie ma dla tego systemu efektywnego programu, w którym mógłbym sprawnie montować rozmaite materiały wideo. Bez wątpienia słaba promocja aplikacji pisanych dla Linuksa powoduje, że trzeba mieć trochę szczęścia, aby trafić na FFmpeg. Tymczasem naprawdę warto, poprzez jego eksplorowanie uczymy się korzystania z linii poleceń Linuksa. Jestem dobrym przykładem, jak walory FFmpega zmusiły mnie do jego nauki na Windowsie, a następnie do dalszego zgłębiania Linuksa.
FFmpeg to wszechstronna platforma do kompleksowej obróbki wideo. Jak większość dobrodziejstw pochodzących z Linuksa jest po prostu świetna, choć nie pozbawiona wad. Program stworzył Fabrice Bellard w 2000 roku, a obecnie jest rozwijany przez FFmpeg team.
Mamy do wyboru rozmaite edytory wideo, które lepiej lub gorzej przydadzą się do sporządzania materiałów edukacyjnych. Wszystkie jednak finalnie produkują plik wyjściowy w procesie transkodowania, a to z kolei wymaga mocnego sprzętu i w zależności od wydajności karty graficznej zajmuje od około kilku do kilkudziesięciu minut. W FFmpeg do konwersji transkodowanie nie jest konieczne, a jeśli jest konieczne po ewentualnej edycji, jest dużo szybsze.
Oprócz wspomnianych, FFmpeg ma sporo innych zalet, jak współpraca z większością znanych formatów, czy multum możliwości edycyjnych. Jednocześnie dostrzegam potrzebę stworzenia spójnego interfejsu graficznego, który umożliwiłby choćby zawansowane operacje graficzne. Trudno mi sobie wyobrazić praktyczne śledzenie postaci przy pomocy interfejsu tekstowego.
Po pobraniu, trzeba go zainstalować, a to już nie jest takie proste. Oto kilka przydatnych linków wprowadzających do tematu FFmpeg:
- Oficjalna dokumentacja, niestety zaprezentowana na jednej stronie bez podziału na sekcje, przez co ze względu na swą obszerność potrafi zawiesić przeglądarkę.
- Wiki
- Najnowsze kompendium. Ponad 1000 stron wiedzy.
- Poradnik dla początkujących zawierający przystępne wprowadzenie wraz z procedurą instalacji i dodania programu do zmiennych środowiskowych.
- Przykłady zastosowania.
- Szybki przewodnik po konwersji.
- Wnikliwe wprowadzenie od NERDfirsta z przykładami. Polecam czwartą i piątą część o miksowaniu filtrów.
- 160 animacji od NERDfirsta prezentujących możliwości FFmpeg. Polecam.
Pobieramy program z tej strony Po kilku przekierowaniach ściągamy archiwum .7z
Rozpakowujemy archiwum do dowolnego folderu, zmieniamy jego nazwę na ffmpeg i wklejamy go do wybranego katalogu, np. do głównego katalogu na dysku systemowym.
Następnie postępujemy według następującej kolejności: Przycisk Start –> Wyszukaj Zaawansowane ustawienia systemu –> Okno Właściwości systemu –> Zakładka Zaawansowane –> Przycisk Zmienne środowiskowe –> Okno Zmienne środowiskowe –> Sekcja Zmienne użytkownika –> Zaznacz Path –> Przycisk Edytuj –> Okno Edycja zmiennej środowiskowej –> Przycisk Nowy –> Wpisz C:\ffmpeg\bin –> Zatwierdzamy OK
Jeśli udostępnimy aplikację dla wszystkich użytkowników, wówczas zmienną środowiskową Path edytujemy w sekcji Zmienne systemowe.
W przypadku innego katalogu, niż folder główny, w którym umieścimy docelowo naszą aplikację, zamiast C:\ffmpeg\bin wpisujemy stosowną bezwzględną ścieżkę.
Weryfikujemy instalację w Wierszu poleceń, Terminalu lub PowerShell wpisując ffmpeg i wciskając Enter Pojawi się lista dostępnych opcji.
Od teraz możemy korzystać z FFmpeg w dowolnym folderze, nie tylko instalacyjnym, jak by to miało miejsce bez przeprowadzenia powyższej czynności. W tym celu przytrzymując SHIFT wciskamy prawy przycisk myszy, a później Otwórz w Terminalu.
ffmpeg -i in.mp4 -vf "transpose=1" out.mp4
-i in.mp4 | Plik wejściowy przeznaczony do obrócenia wideo |
-vf „transpose=1” | Filtr transpose opcji –vf z obranym parametrem kąta obrotu. Dla 1 mamy 90 stopni, wpisując 3 obracamy o 270 stopni. |
out.mp4 | Plik wyjściowy z obróconym wideo |
ffmpeg -i in.mp4 -vf "drawtext='fontfile=ArialBlack.ttf:text=2023-05-27:fontsize=55:fontcolor=#33B7FF:x=w-tw-35:y=h-th-30'" -c:a copy out.mp4
-vf | opcja wprowadzająca wybrane filtry wideo. Zamiennie działa też -filter_complex |
drawtext= | Filtr umożliwiający wprowadzenie tekstu do wideo z dobranymi parametrami. Pamiętajmy o podwójnych i pojedynczych cudzysłowach |
fontfile=ArialBlack.ttf | Plik z pożądaną czcionką, ewentualnie bezwzględna ścieżka do niego. |
text= | Dowolny tekst do wtopienia. |
fontsize=60 | Rozmiar czcionki. |
fontcolor=#33B7FF | Barwa czcionki. Można ją wyrazić słownie, np. red |
x=w-tw-35: y=h-th-30 | Kluczowa sekwencja pozycjonująca tekst w prawym dolnym rogu 35 pikseli na lewo i 30 pikseli w górę. |
-c:a copy | Kopiuje strumień audio bez jego konwertowania |
Pamiętajmy o cudzysłowach, ich rodzajach, dwukropkach i pomijaniu zbędnych spacji. Kluczowe jest pozycjonowanie, które w FFmpeg domyślnie odbywa się w od lewego górnego rogu (wówczas np. x=34:y=77 Kolejność filtrów nie jest przypadkowa i ich przestawianie w składni może skończyć się niepowodzeniem.
NERDfirst w swojej 0612 TV w bardzo schludnym i przystępnym stylu omawia podstawy modyfikacji jakości obrazu. Dla wyjściowych plików avi używamy kwantyzatora -q, przy czym im mniejsza wartość od 1 do 50, tym lepsza jakość i większy rozmiar pliku.
ffmpeg -i in.mp4 -q 20 out.avi
Jeśli wyjściowym plikiem ma być mp4, wówczas stosujemy -crf
ffmpeg -i in.mp4 -crf 18 out.mp4
Gdy potrzebujemy większej precyzji, modyfikujemy bitrate:
ffmpeg -i in.mp4 -b:v 1000k -b:a 128k out.mp4
gdzie strumień wideo w pliku out.mp4 będzie miał przepływność 1000kb/s (trochę mało), a strumień audio 128kb/s. Zauważmy, że zmieniamy tutaj jakość wideo wraz z jakością audio i pamiętajmy o różnicy między jednostkami kb i kB.
ffmpeg -i in.mp4 -vf "unsharp=lx=7:ly=7:la=1.5" out.mp4
Parametry lx i ly odpowiadają za działanie filtra w pionie i poziomie, ale główną robotę robi parametr la. Zauważyłem też, że filtr nie działa z opcją -filter.
Stosujemy filtr -eq z opcją -vf zmieniając kontrast:
ffmpeg -i in.mp4 -vf "eq=contrast=1.3" out.mp4
gdzie wartość 1.0 oznaczałaby brak zmian. W przypadku rozjaśniania brak zmian wynikałby z przyjęcia wartości 0.0 dla filtra brightness
ffmpeg -i in.mp4 -vf "eq=brightness=0.3" out.mp4
Nasycenie zmieniamy przy pomocy filtra saturation. Wartość 1.0 równa się brak zmian.
ffmpeg -i in.mp4 -vf "eq=saturation=1.5" out.mp4
W poniższej linijce zmieniamy wartość gamma dla kanału czerwonego:
ffmpeg -i in.mp4 -vf "eq=gamma_r=1.5" out.avi
Oto tabela nastaw, które możemy modyfikować według uznania:
Red | Green | Blue | |
Shadows | rs | gs | bs |
Midtones | rm | gm | bm |
Highlights | rh | gh | bh |
ffmpeg -i in.mp4 -vf "colorbalance=rs=-0.3:bs=0.3:rh=0.1:bh=-01" out.avi
ffmpeg -ss 02:07 -i.mp4 -t 58 out.mp4
-ss 02:07 -i | Czas początku wycinanego fragmentu pliku wejściowego, konkretnie 2min 7s |
-t 58 | Czas trwania wycinanego fragmentu, konkretnie 58s. |
ffmpeg -i part1.mp4 -i part2.mp4 -i part3.mp4 -filter_complex "[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] concat=n=3:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" out.mp4
-i part1.mp4 -i part2.mp4 -i part3.mp4 | Pliki do połączenia poprzedzone informacją -i że są to pliki wejściowe |
-filter_complex | Filtr _complex opcji -filter umożliwiający przetwarzanie kilku plików |
[0:v] [0:a] [1:v] [1:a] [2:v] [2:a] | Informacja, które strumienie wideo/audio zostaną wysłane do filtra concat |
concat=n=3:v=1:a=1 [v] [a] | Filtr concat uwzględnia 3 pliki wejściowe i generuje po jednym strumieniu wideo i audio |
-map „[v]” -map „[a]” | Informacja dla FFmpeg, aby używał strumieni wideo i audio z filtra concat |
out.mp4 | plik wyjściowy, który powstanie po zakończeniu operacji |
Niestety konieczne będzie transkodowanie, więc nie umieszczajmy opcji -c copy, aby nie zakończyć całego procesu niepowodzeniem.
ffmpeg -f concat -i list.txt -c copy out.mp4
Pod list.txt podstawiamy wejściowy plik tekstowy z listą plików, które chcemy połączyć. Przykładowa lista poniżej.
file 'part1.mp4'
file 'part2.mp4'
file 'part3.mp4'
Metoda z listą przeznaczona jest dla klipów wykonanych z identycznymi parametrami. Transkodowanie nie jest konieczne i opcja -c copy jest jak najbardziej dopuszczalna.
ffmpeg -i in.mp4 -i chapfile.txt -map_chapters 1 -c copy out.mp4
-i | opcja informująca o tym, że in.mp4 jest plikiem wejściowym |
in.mp4 | plik wejściowy przeznaczony do obróbki |
-i | kolejna informacja o tym, że chapfile.txt jest plikiem wejściowym |
chapfile.txt | plik tekstowy z informacjami o przyjętych jednostkach czasowych, czasach początków i końców rozdziałów oraz ich nazwach |
-map_chapters | opcja mapująca rozdziały w pliku wejściowym chapfile.txt |
1 | informacja mówiąca, że mapowanie pliku in.mp4 (pierwszy plik wejściowy z nr 0) zawarte zostało w drugim pliku wejściowym (chapfile.txt z nr 1) |
-c | opcja umożliwiająca modyfikowanie strumieni |
copy | parametr opcji -c określający, że chcemy skopiować (zamiast zbędnego transkodowania) strumienie w pliku wejściowym in.mp4 |
out.mp4 | plik wyjściowy, który powstanie po zakończeniu operacji |
Jak sami zauważycie opcja kopiowania strumieni -c copy wyraźnie przyspiesza całą operację. Nie ma bowiem potrzeby ich ponownego transkodowania, o ile nie zależy nam na zmianie ilości klatek, bitratu, rozdzielczości, czy innych parametrów. Tego unikalnego atutu nie mogłem znaleźć w żadnym innym edytorze. Pod in.mp4, chapfile.txt i out.mp4 podstawiamy nazwy stosownych plików.
Opcja -map_chapters jak najbardziej działa w przeciwieństwie do sugerowanej w oficjalnej dokumentacji opcji -map_metadata.
Przed wyróżnianiem rozdziałów musimy jeszcze sporządzić plik tekstowy (chapfile.txt) następującej treści:
;FFMETADATA1
[CHAPTER]
TIMEBASE=1/1000
START=0
END=112212
title=Tytuł pierwszego rozdziału widoczny w menu VLC.
[CHAPTER]
TIMEBASE=1/1000
START=112212
END=234267
title=Tytuł drugiego rozdziału widoczny w menu VLC.
[CHAPTER]
TIMEBASE=1/1000
START=234267
END=282949
title=Tytuł trzeciego rozdziału widoczny w menu VLC.
W linijkach START i END podajemy początek i koniec rozdziału w milisekundach. Informację dla FFmpeg o tym, że są to milisekundy zawieramy w linii TIMEBASE. Jeżeli zechcemy podać czas w sekundach, wówczas TIMEBASE=1/1. Milisekundy, jak podaje oficjalna dokumentacja to jednostki domyślne, więc jeśli pominiemy linijkę TIMEBASE, nic złego się nie stanie.
FFmpeg jest jednym z najbardziej wiarygodnych źródeł informacji o naszym wideo. Poniższa komenda wyświetli nam potrzebne dane. Zazwyczaj chodzi nam o datę wykonania oryginalnego filmu, która jednak będzie wyszczególniona pod warunkiem, gdy wcześniej nie wykonaliśmy transkodowania.
ffmpeg -hide_banner -i in.mp4
gdzie -hide_banner ukrywa info o ogólnych opcjach programu.
Aby zaktualizować nasz FFmpeg musimy podmienic pliki w katalogu \FFmpeg\bin po ściągnięciu archiwum z ffmpeg.org. Poniższa komenda wykaże sens tej czynności podając posiadaną aktualnie wersję.
ffmpeg -version | grep "ffmpeg version"
gdzie grep filtruje dane wyjściowe, aby były widoczne tylko informacje o wersji.
Podstawowa składnia posiada następującą sekwencję
ffmpeg -i in.avi out.mp4
gdzie pliki wejściowe poprzedzamy każdorazowo -i Na końcu podajemy nazwę pliku wyjściowego. Prawdopodobnie doświadczycie pewnych różnic używając Wiersza poleceń, Terminalu, czy PowerShell. W Windows wszystkie one mają skróty pod znakiem Windowsa w menu Start. Ja korzystam z Terminala. Oczywiście lista obsługiwanych formatów jest bardzo szeroka i prawdopodobnie nie będziecie mieli z tym problemu.
Gdzieś przeczytałem „FFmpeg to wieczna beta.” Zdaje się, że twórcy wieżą w prawdę, że nigdy nie dostąpimy doskonałości i zawsze będzie coś do poprawy. Dlatego czasem, nie wiadomo skąd pojawiają się problemy. Na rozmaitych witrynach można pobierać interfejsy graficzne, ale i tak nie posiadają one jeszcze zaawansowanych funkcji znanych z edytorów graficznych, jak choćby śledzenie twarzy. Po kilkutygodniowej refleksji i czacie ze sztuczną inteligencją wydaje mi się, że FFmpeg nigdy nie stanie się kompletnym edytorem, jako że interfejs tekstowy jest mu pisany zarówno dosłownie, jak i w przenośni stanowiąc jego cechę immanentną.
Dzięki braku GUI, FFmpeg góruje nad innymi edytorami wydajnością, elastycznością, skalowalnością oraz szybszą adaptacją nowych funkcji i poprawek. Tylko kto za tym nadąży?
Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me?