Wyobraźcie sobie, że bierzemy wszystkie klatki z pewnego filmu i ustawiamy je jedna przy drugiej, tak że utworzą prostopadłościan. Dwa wymiary tego prostopadłościanu to wymiary klatki, trzeci wymiar to ilość klatek w filmie. I teraz wyobraźcie sobie, że przecinamy ten prostopadłościan poziomą płaszczyzną i oglądamy przekrój. Taki przekrój będę nazywał przekrojem filmu.
Taki przekrój filmu zrobić jest łatwo. Najpierw rozbijamy film na klatki:
$ mplayer film.avi -vo png -nosound
Potem z każdej klatki wycinamy środkowy pasek:
$ mkdir paski
$ (for i in *png; do echo $i; convert $i -crop 640x1+0+256 tmp.bmp; convert tmp.bmp paski/$i; done)
Potem sklejamy te paski w gotowy przekrój:
$ montage paski/*png -tile 1x -geometry +0+0 zmontowane.png
I już. Tylko trzeba uważać, bo już dla dziesięciominutowego filmu sklejanie pasków trwało u mnie dwadzieścia minut, a obraz wyszedł bardzo wysoki. Gdyby robić taki przekrój filmu godzinnego, trzeba by mieć albo mocny komputer, albo sprytniejszą metodę, albo podzielić ten przekrój na kawałki.
Oto przekrój filmu Reksio śpiewak (kliknij na poniższą miniaturę, żeby zobaczyć wersję w pełnych rozmiarach):
Można zrobić kolejne przekroje na różnych wysokościach klatki, a potem połączyć je w film. Zrobiłem tak z fragmentem z filmu Golem (plik, obejrzyj). Tym razem kroiłem krótszy fragment, żeby przekrój nie był taki wysoki. Poniżej zobaczysz film z tym przekrojem i kilka dodatkowych filmów. Filmy są w dwu wersjach: jako pliki avi do ściągnięcia i jako gotowe oglądadła w odtwarzaczu fleszowym. Wersją oficjalną są pliki avi - tego odtwarzacza słabo znam, więc nie jestem pewien, czy nie oszukuje w rozmiarach czy coś.
Oto sam animowany przekrój: plik, obejrzyj.
Oto rysunek, który fragment filmu jest w którym miejscu przekroju:
A oto to samo, tylko w wersji animowanej. Ten film pokazuje, która klatka z Golema jest na której wysokości przekroju. Przekrój na wysokości 80 pikseli od góry ekranu. plik, obejrzyj.
A teraz to samo, tylko że przekrój był zrobiony na wysokości 200 pikseli od góry ekranu. plik, obejrzyj.
A teraz odwrotnie. Ten film pokazuje jak zmienia się przekrój, kiedy linia cięcia płynie od góry do dołu ekranu. Film stoi zatrzymany na pięćdziesiątej klatce. plik, obejrzyj.
I jeszcze raz to samo, ale dla klatki sto pięćdziesiątej. plik, obejrzyj.
Oto polecenia, których użyłem do wygenerowania tych filmów:
$ mplayer golem-fragment.avi -vo png -nosound $ (for i in *png; do echo $i; convert $i -crop 376x1+0+239 tmp.bmp; convert tmp.bmp paski/$i; done) $ (for y in `seq 1 239`; do echo ======= $y; mkdir paski/$y; for f in klatki/*png; do convert $f -crop 376x1+0+$y tmp.bmp; convert tmp.bmp paski/$y/`basename $f`; done ; montage paski/$y/*png -tile 1x -geometry +0+0 klatka-`printf '%04d' $y`.png ; done) $ (for i in `seq 1 351`; do echo $i; convert -size 752x351 xc:white -draw "image over 0,0 0,0 'przekroj-0080.png'" -draw "image over 0,$i 0,0 'kreska.png'" -draw "image over 377,0 0,0 '../klatki/`printf '%08d' $i`.png'" -draw "image over 377,80 0,0 'kreska.png'" efekt/przekroj_z_filmem-`printf '%04d' $i`.jpg; done) $ (for i in `seq 1 351`; do echo $i; convert -size 752x351 xc:white -draw "image over 0,0 0,0 'przekroj-0200.png'" -draw "image over 0,$i 0,0 'kreska.png'" -draw "image over 377,0 0,0 '../klatki/`printf '%08d' $i`.png'" -draw "image over 377,200 0,0 'kreska.png'" efekt/przekroj_z_filmem-`printf '%04d' $i`.jpg; done) $ mplayer 'mf://efekt/*jpg' -fps 8 -audiofile golem-fragment.mp3 $ mencoder 'mf://efekt/*jpg' -fps 8 -audiofile golem-fragment.mp3 -o przekroj_z_filmem-080.avi -oac copy -ovc lavc $ mencoder 'mf://efekt/*jpg' -fps 8 -audiofile golem-fragment.mp3 -o przekroj_z_filmem-200.avi -oac copy -ovc lavc $ (for i in `seq 1 239`; do echo $i; convert -size 752x351 xc:white -draw "image over 0,0 0,0 'przekroje/klatka-`printf '%04d' $i`.png'" -draw "image over 0,50 0,0 'przekroj_i_film/kreska.png'" -draw "image over 377,0 0,0 'klatki/00000050.png'" -draw "image over 377,$i 0,0 'przekroj_i_film/kreska.png'" przekroj_w_czasie/przekroj_w_czasie-`printf '%04d' $i`.jpg; done) $ (for i in `seq 1 239`; do echo $i; convert -size 752x351 xc:white -draw "image over 0,0 0,0 'przekroje/klatka-`printf '%04d' $i`.png'" -draw "image over 0,150 0,0 'przekroj_i_film/kreska.png'" -draw "image over 377,0 0,0 'klatki/00000150.png'" -draw "image over 377,$i 0,0 'przekroj_i_film/kreska.png'" przekroj_w_czasie/przekroj_w_czasie-`printf '%04d' $i`.jpg; done) $ mplayer 'mf://przekroj_w_czasie/*jpg' -fps 15 $ mencoder 'mf://przekroj_w_czasie/*jpg' -fps 15 -o przekroj_w_czasie-050.avi -ovc lavc
Zrobienie analogicznej operacji z dźwiękiem pozostawiamy jako ćwiczenie dla czytelnika.