První pokus s jednou oblastí:
ffmpeg -i frame_10s.png -filter_complex "[0:v]crop=30:57:110:225[left];[0:v][left]overlay=140:225[out]" -map "[out]" frame_masked.png
Ted dvě oblasti zamaskují modrý kovový vršek a modrou nálepku (tj. dvě oblasti):
ffmpeg -i frame_10s.png -filter_complex "
[0:v]crop=34:61:104:223[c1];
[0:v]crop=60:104:72:330[c2];
[0:v][c1]overlay=138:223[tmp];
[tmp][c2]overlay=132:330[out]
" -map "[out]" frame_masked.png
Nakonec chci hlavně udělat framu doprava, přímo ve videu, a následně to maskování framu.
ffmpeg -i "donio cuts horizontal.mp4" -filter_complex "
[0:v]transpose=1,split=3[base][c1src][c2src];
[c1src]crop=34:61:104:223[c1];
[c2src]crop=60:104:72:330[c2];
[base][c1]overlay=138:223[tmp];
[tmp][c2]overlay=132:330[out]
" -map "[out]" -c:v libx264 -crf 18 -preset veryfast -c:a copy "donio cuts vertical.mp4"
FFmpeg – vysvětlení filtrů a labelů
1. Co jsou hranaté závorky [xxx]
V filter_complex
FFmpeg používáš hranaté závorky pro označení vstupů a výstupů filtrů:
[0:v]
— první vstupní soubor, video stream.[0:a]
— první vstupní soubor, audio stream.[c1]
,[base]
,[tmp]
,[out]
— libovolná pojmenování mezivýstupů.
Tyto "labely" se používají v řetězci filtrů nebo v -map
, aby FFmpeg věděl, který výsledek má použít.
2. Rozklad příkazu
Příkaz, který jsme používali:
ffmpeg -i "donio cuts horizontal.mp4" -filter_complex "
[0:v]transpose=1,split=3[base][c1src][c2src];
[c1src]crop=34:61:104:223[c1];
[c2src]crop=60:104:72:330[c2];
[base][c1]overlay=138:223[tmp];
[tmp][c2]overlay=132:330[out]
" -map "[out]" -c:v libx264 -crf 18 -preset veryfast -c:a copy "donio cuts vertical.mp4"
a) Otočení + split
[0:v]transpose=1,split=3[base][c1src][c2src];
- transpose=1
otočí video o 90° CW.
- split=3
vytvoří tři větve: [base]
, [c1src]
, [c2src]
.
b) Crop výřezů (záplat)
[c1src]crop=34:61:104:223[c1];
[c2src]crop=60:104:72:330[c2];
- crop=šířka:výška:x:y
vystřihne obdélník ze zdrojové větve.
- Výstupy jsou pojmenovány [c1]
a [c2]
.
c) Overlay první oblasti
[base][c1]overlay=138:223[tmp];
Překryje základní video [base]
záplatou [c1]
na pozici x=138, y=223. Výsledek pojmenuje [tmp]
.
d) Overlay druhé oblasti
[tmp][c2]overlay=132:330[out]
Překryje mezivýsledek [tmp]
druhou záplatou [c2]
na pozici x=132, y=330. Konečný výsledek je [out]
.
e) Mapování
-map "[out]"
Říká FFmpeg, aby použil label [out]
jako video výstup. Bez mapování by FFmpeg nevěděl, který mezivýsledek exportovat.
3. Shrnutí
- Labely jsou libovolné názvy; místo
[out]
můžeš použít[final]
. - Split vytváří paralelní větve obrazu.
- Overlay překrývá jeden obraz na druhý.
- Cruicial order: filtry se musí logicky propojit, vstupy musí odpovídat výstupům předchozích filtrů.
- Audio:
-c:a copy
kopíruje zvuk beze změny. - Kvalita:
-crf 18 -preset veryfast
pro dobrou kvalitu a rychlost.
4. Test na obrázku
ffmpeg -i frame_10s.png -filter_complex "
[0:v]crop=34:61:104:223[c1];
[0:v]crop=60:104:72:330[c2];
[0:v][c1]overlay=138:223[tmp];
[tmp][c2]overlay=132:330[out]
" -map "[out]" frame_masked.png
* * *
PŘIDÁNÍ AUDIA DO VÝSTUPU
ffmpeg -i "donio cuts horizontal.mp4" -filter_complex "
[0:v]transpose=1,split=3[base][c1src][c2src];
[c1src]crop=34:61:104:223[c1];
[c2src]crop=60:104:72:330[c2];
[base][c1]overlay=138:223[tmp];
[tmp][c2]overlay=132:330[out]
" -map "[out]" -map 0:a -c:v libx264 -crf 18 -preset veryfast -c:a copy "donio cuts vertical.mp4"
Funguje opravdu skvěle.
Žádné komentáře:
Okomentovat