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.mp4Plik 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.mp4Plik 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
-vfopcja 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.ttfPlik z pożądaną czcionką, ewentualnie bezwzględna ścieżka do niego.
text=Dowolny tekst do wtopienia.
fontsize=60Rozmiar czcionki.
fontcolor=#33B7FFBarwa czcionki. Można ją wyrazić słownie, np. red
x=w-tw-35: y=h-th-30Kluczowa sekwencja pozycjonująca tekst w prawym dolnym rogu 35 pikseli na lewo i 30 pikseli w górę.
-c:a copyKopiuje 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:

RedGreenBlue
Shadowsrsgsbs
Midtonesrmgmbm
Highlightsrhghbh
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 58Czas 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.mp4Pliki do połączenia poprzedzone informacją -i że są to pliki wejściowe
-filter_complexFiltr _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.mp4plik 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
-iopcja informująca o tym, że in.mp4 jest plikiem wejściowym
in.mp4plik wejściowy przeznaczony do obróbki
-ikolejna informacja o tym, że chapfile.txt jest plikiem wejściowym
chapfile.txtplik tekstowy z informacjami o przyjętych jednostkach czasowych, czasach początków i końców rozdziałów oraz ich nazwach
-map_chaptersopcja mapująca rozdziały w pliku wejściowym chapfile.txt
1informacja 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)
-copcja umożliwiająca modyfikowanie strumieni
copyparametr opcji -c określający, że chcemy skopiować (zamiast zbędnego transkodowania) strumienie w pliku wejściowym in.mp4
out.mp4plik 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?

Similar Posts

One Comment

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.