Projekty 3LO

Geneza

Zaprosiłem na Wydział Matematyki, Fizyki i Informatyki ludzi z 3LO w Gdyni. Uczniowie, którzy zainteresowali się pokazowym wykładem, jaki przeprowadziłem w ich szkole, mogą brać udział w zajęciach Koła Naukowego GameForge, które prowadzę w Instytucie Informatyki. Okazało się, że można liczyć na ludzi z 3LO – kilka osób przyszło, i mam nadzieję, że spędzili czas owocnie. W przyszłości możliwe są dalsze wspólne prace pod moim kierunkiem, ale geneza tych zajęć jest taka, że każdy może zrobić coś fajnego, jeżeli ma dobry pomysł. Najlepiej zatem przyjść z własnym tematem, np. „chcę zrobić walkę na miecze świetlne”, lub „chcę nakręcić efekt wychodzenia ze ściany”. Będziemy razem zastanawiać się jak zrobić pewne efekty specjalne, a potem spróbujemy je zrealizować. Oczywiście wszystko przy pomocy programu – studia, jakim jest Blender. I wszystko pod Linuxem (przynajmniej, jeżeli chodzi o mnie) :)

Spotkanie numer 20140117

Nagraliśmy w trakcie tego spotkania siedem kluczowych materiałów filmowych, które oparte są o dwa pomysły.

  1. Pomysł A: zróbmy film, gdzie cała sala wykładowa jest zapełniona jedną i tą samą osobą.
    W tym przypadku zadanie jest proste do zrealizowania technicznie, ponieważ wystarczy nagrać kamerą lub aparatem ustawionym na statywie całą salę, na której siedzi wszędzie jedna osoba. Ponieważ jednak nie umieliśmy się rozdwoić, potroić i w ogóle zwielokrotnić, postanowiliśmy, że do zrobienia tego nagrania użyjemy jednej osoby, którą nagramy po kolei na każdym krześle. Takie krótkie ujęcia trzeba następnie połączyć w jedno, odpowiednio sklejając ze sobą filmy, wykorzystując może jakieś maskowanie, lub wycinanie. Tutaj dochodzi do większej pracy przy komputerze, niż przy nagrywaniu materiału – postprocessing zajmie znaczną część czasu potrzebnego na zrobienie takiego filmu.Nagrania, które zrobiliśmy w tej części prac, nagrane zostały aparatem Sony Alpha A65 w jakości FullHD 50fps. Szczegóły wyglądają tak:

    • Filmy z Tomkiem:
      • tomek1.mts: Duration: 00:10:39.84, start: 1.000011, bitrate: 26565 kb/s, rozmiar: 2GiB
        Stream #0:0[0x1011]: Video: h264 (High) (HDPR / 0x52504448), yuv420p, 1920×1080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 100 tbc
        Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
        Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090)

      • tomek2.mts: Duration: 00:02:28.33, start: 640.348000, bitrate: 26493 kb/s, rozmiar: 469MiB
        Stream #0:0[0x1011]: Video: h264 (High) (HDPR / 0x52504448), yuv420p, 1920×1080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 100 tbc
        Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
        Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090)

    • Filmy z Mateuszem:
      • mateusz1.mts: Duration: 00:10:39.84, start: 1.000011, bitrate: 26565 kb/s, rozmiar: 2GiB
        Stream #0:0[0x1011]: Video: h264 (High) (HDPR / 0x52504448), yuv420p, 1920×1080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 100 tbc
        Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
        Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090)

      • mateusz2.mts: Duration: 00:02:57.16, start: 640.316000, bitrate: 26500 kb/s, rozmiar: 560MiB
        Stream #0:0[0x1011]: Video: h264 (High) (HDPR / 0x52504448), yuv420p, 1920×1080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 100 tbc
        Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
        Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090)

  2. Pomysł B: zróbmy film, gdzie ktoś stoi przed tablicą, a w tablicy pokazuje się ta sama osoba, lub duch kredowy.
    To zadanie można zrealizować na różne sposoby. Najprościej jest nagrać film z tablicą w rolach głównych, a potem dwa filmy z aktorem. Pierwszy taki film zawierać powinien aktora pierwszoplanowego, drugi – drugoplanowego. Aktor drugiego planu może być „mistrzem drugiego planu”, zależnie od tego, co przyjdzie nam do głowy. W tym przypadku nagranie wykonaliśmy tak, że wykorzystaliśmy zielony ekran. Dzięki niemu możemy wyciąć całe otoczenie aktorów, a następnie zwyczajnie wkleić ich do filmu, który zawiera główne tło. Na temat tej opracji jest osobny tutorial. Nagrane filmy mają takie oto parametry:

    • tablica-pusta.mts: Duration: 00:01:15.36, start: 1.000011, bitrate: 26506 kb/s 239MiB
          Stream #0:0[0x1011]: Video: h264 (High) (HDPR / 0x52504448), yuv420p, 1920×1080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 100 tbc
          Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
          Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090)

    • mikolaj1.mts: Duration: 00:01:10.08, start: 1.000011, bitrate: 26506 kb/s, rozmiar 222MiB
      Stream #0:0[0x1011]: Video: h264 (High) (HDPR / 0x52504448), yuv420p, 1920×1080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 100 tbc
          Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
          Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090)

    • mikolaj2.mts: Duration: 00:01:01.92, start: 1.000011, bitrate: 26443 kb/s, rozmiar: 196MiB
      Stream #0:0[0x1011]: Video: h264 (High) (HDPR / 0x52504448), yuv420p, 1920×1080 [SAR 1:1 DAR 16:9], 50 fps, 50 tbr, 90k tbn, 100 tbc
          Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
          Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090

Wyniki

Film z Tomkiem czeka na realizację.

Film z Mateuszem czeka na realizację.

Film z Mikołajem jest gotowy, tablica została już opracowana, poradnik jak to zrobić jest w drodze. Poniżej kilka zrzutów z filmu:

tab1tab2tab3tab4

Konwersja formatów wideo

Zadanie konwersji formatów wideo jest szeroko dyskutowane na forach. Jest to temat niełatwy, a dostępność zaawansowanego oprogramowania sprawy nie upraszcza. No chyba, że jesteś Tym, Który się Zna. Poniżej przedstawiam prosty sposób na konwersję materiałów wideo, oraz parę złych sposobów.

Sposób 1: Używamy Blendera. Wbrew pozorom ten sposób jest zły (ale wygodny), ponieważ mimo, że doprowadzi nas do oczekiwanego efektu (np. zmniejszenie rozmiaru pliku lub zmiana rozdzielczości filmu), to jednak liczba opcji dostępnych podczas tego procesu jest bardzo ograniczona, a samo działanie Blendera podczas konwersji potrafi być niemożliwie wolne. Można to jednak zrobić, a niektóre pomocne szczegóły są wyjaśnione w tutorialach dotyczących VSE, np. tutaj.

Sposób 2: Używamy jakiegoś programu okienkowego. Zdaję sobie sprawę, że jest to być może preferowany sposób, zwłaszcza dla osób, które przywykły do interfejsu windozy lub innych ograniczających systemów. Można. Jeżeli się chce, wystarczy ściągnąć jakiś program w stylu VirtualDub, Pitivi, Kino lub nawet VLC, aby wykonać konwersję. Jest to sposób dla tzw. „klikaczy”, którzy – być może poza umiejętnością klikania – nie ogarniają zbyt wiele.

Sposób 3: Konwertujemy film na poszczególne klatki, a następnie zmieniamy je na film. Można zrobić to zarówno w Blenderze, w innych programach okienkowych, jak i z wiersza poleceń. Jest to metoda związana z prawdziwą masakrą miejsca na dysku – na przykład skonwertowanie (za pomocą mplayera)  oryginalnego nagrania filmu ‚tomek1’, doprowadziło do zrzucenia każdej klatki w postaci pliku PNG (czyli dobrze – bezstratnie). Każda sekunda tego ponad 10 minutowego filmu dostarczyła 50 obrazków o rozdzielczości 1920×1080, które zajmowały średnio 2-7MiB. Cały katalog z surowymi klatkami filmu zajął ponad 192GiB! Druga część była krótsza, film ‚tomek2’ dostarczył „tylko” 43GiB danych w postaci surowych klatek. Oczywiście, możliwa jest konwersja klatek z formatu PNG do JPG, ale odbywać się ona będzie ze stratą jakości, być może niezauważalną, ale jednak. W przypadku konwersji do plików JPG ilość wymaganego miejsca jest o wiele mniejsza. Dla zainteresowanych podaję polecenia Linuxowe, które można wykonać w terminalu na pliku filmowym, aby skonwertować go na serię obrazków:

Konwersja filmu na obrazki za pomocą mplayer:

mkdir DIR
time mplayer FILM -noframedrop -speed 100 -vf framestep=1 -nosound -noautosub -nolirc -vo png:outdir=DIR

Tego typu polecenie wymaga, abyśmy w miejsce napisów DIR oraz FILM podstawili naszą nazwę katalogu dla wynikowych klatek, oraz nazwę naszego filmu. Nie ma znaczenia w jakim formacie będzie film – może być z komórki (3gp), z kamery (mts), z youtuba (webm,mp4) lub innych źródeł. Wszystko, co umie otworzyć mplayer, da się w ten sposób skonwertować na obrazki. W dodatku, parametr -framestep jest bardzo fajny, ponieważ pozwala na przeskok o podaną liczbę klatek. Dzięki temu, możemy wyciągnąć klatki „co którąś”, a to pozwala zrobić następne fajne rzeczy, np. projekty w stylu stopmotion.

Taki katalog poszczególnych klatek wymaga potem operacji, która może złożyć go w całość. Można zbudować z tych klatek film, wykorzystując polecenie mencoder. Wystarczy wpisać:

mencoder mf://DIR/*.png -mf fps=50 -mf type=png -o FILM -ocv lavc -lavcopts vcodec=mpeg4

Jest to polecenie, które w jednym kroku zrobi od razu cały film. Lepszą jakość można uzyskać przetwarzając obrazki w dwóch krokach, które są nieco bardziej skomplikowane:

export BITRATE= <tutaj wpisz wyliczony bitrate>
export OPT=vbitrate=$BITRATE:mbd=2:keyint=132:v4mv:vqmin=3:lumi_mask=0.07:dark_mask=0.2:mpeg_quant:scplx_mask=0.1:tcplx_mask=0.1:naq
mencoder -ovc lavc -lavcopts vcodec=mpeg4:vpass=1:$OPT -mf type=png:fps=50 -nosound -o /dev/null mf://DIR/*.png
mencoder -ovc lavc -lavcopts vcodec=mpeg4:vpass=2:$OPT -mf type=png:fps=50 -nosound -o FILM mf://DIR/*.png

Nie będę wyjaśniał wszystkich opcji (są opisane w manualu). Ważne, aby zamienić w powyższym wierszu słowa DIR, FILM oraz BITRATE na odpowiednie wartości. Wartość BITRATE jest możliwa do wyliczenia na podstawie wzoru: 50 × FPS × H × W / 256. Zmienne FPS to liczba klatek na sekundę (czyli fps), H i W to wysokość i szerokość obrazu w pikselach. Jeżeli mamy film, który chcemy odtwarzać z prędkością 25 klatek na sekundę, a każda klatka ma rozdzielczość 1920×1080, to bitrate będzie wynosił: 50×25×1920×1080/256, czyli 10125000. Przetwarzanie dwuprocesowe jest dłuższe, ale generuje filmy o lepszej jakości.

Sposób 4: Używamy dedykowanego programu do konwersji: ffmpeg. Jest to moim zdaniem najbardziej uniwersalna, chociaż najtrudniejsza wersja. Dzięki użyciu tego programu mamy abosolutnie pełną kontrolę nad procesem, możemy zrobić z filmem i dźwiękiem dosłownie wszystko. Ten program to prawdziwy kombajn, a lista jego opcji to przynajmniej kilkanaście stron a4 :) Obsługuje prawie wszystkie znane formaty filmów, no i można skompilować go sobie samemu, aby osiągnąć maksymalną wydajność i ewentualne dodatkowe możliwości. Dla porównania – konwersja za pomocą mplayera na obrazki trwała bardzo długo – zwykle ponad godzinę w przypadku 2GB filmu, a przy okazji tworzony pliki zajmowały bardzo wiele miejsca. W przypadku ffmpega te problemy nie mają zastosowania, ponieważ możemy od razu skonwertować film na inny film, dodatkowo usuwając niepotrzebne dane (takie jak dźwięk lub strumień tekstowy z czasem nagrania).

Obrazki otrzymane po konwersji filmu na pliki PNG można także poskładać za pomocą ffmpeg, w takim przypadku wiersz poleceń wygląda dość prosto:

ffmpeg -f image2 -r 50 -i DIR/%08d.png -threads 8 -r 25 FILM.avi

Taka konwersja jest wolna, i tracimy jakość, ponieważ domyślne ustawienia są dość przesadzone. Film w takim wypadku zawiera widoczne kwadratowe segmenty pochodzące z intensywnej kompresji. Zapis %08d oznacza format numeracji plików, w tym przypadku nazwy plików muszą składać się z ośmiu cyfr, czyli są to numery. Małe numery z przodu mają wstawione zera, np. 00000001.png, 00000002.png itp.

Tymczasem, aby wydajnie i sensownie skonwertować film na mniejszy w sensie rozdzielczości, z dobrą kompresją, ale też z dobrą jakością, wystarczy napisać:

ffpmeg -r 50 -i FILM -an -vcodec libx264 -preset slow -crf 22 -threads 8 -r 25 -s 1280x720 OUT

W poleceniu tym nazwy FILM oraz OUT trzeba zastąpić nazwą filmu, który chcemy konwertować i nazwą filmu wynikowego. Jak widać podane są dwa razy opcje -r. Opcja ta oznacza prędkość filmu wyrażoną w klatkach na sekundę: najpierw podajemy 50 dla filmu źródłowego, a potem podajemy 25 dla filmu, który chcemy otrzymać. Opcja -s określa rozdzielczość nowego filmu. Dla filmu tomek1.mts, polecenie to będzie miało postać:

ffmpeg -r 50 -i tomek1.mts -an -vcodec libx264 -preset slow -crf 22 -threads 8 -r 25 -s 1280x720 tomek1.avi

Wykonując takie polecenie, pozbyliśmy się dźwięku (dzięki opcji -an), obniżyliśmy liczbę klatek wyświetlanych w ciągu jednej sekundy i zmniejszyliśmy rozdzielczość. Przetworzenie takiego materiału zabiera parę minut, a wynikowy film ma wielkość 41MiB! To znikomy ułamek poprzedniej wielkości! Kompresja w tym przypadku jest niesamowita.

 

 

 

A Ty co o tym myślisz?