Jedná se o šikovný komplexní nástroj z příkazové řádky pro přehrávání (ffplay), úpravu formátů audio a video souborů (úprava rozměru obrazu, hlasitosti, metadat a dalších parametrů). Lze zadat i velice jednoduše, kdy podle koncovky cílového souboru bude výchozí formát. Aby nedošlo k poškození vstupního souboru kolizním přepsáním výstupem, musí se výstup nasměrovat do jiného souboru než je soubor vstupní.
💻 sudo apt install ffmpeg x264 x265
Zjištění formátu a dalších parametrů
💻 ffprobe zdrojový_soubor.mp4
Popis
Pro možnost odzkoušení některých parametrů příkazu ffmpeg je možno si jejich účinek rovnou zobrazit s použitím ffplay (samozřejmě s vynecháním výstupního souboru).
Příklad
Přehrání souboru s upraveným rozlišením obrazu (parametr -i není povinný pro jeden soubor bez složitých filtrů).
💻 ffplay -i zdrojový_soubor.mp4 -vf scale=800:450
Komprimační vztah „něco za něco“
Obecně platí:
| 🔴 nízká komprimace | 🟢 rychlý převod (nízké zatížení CPU) | 🔴 velký výsledný soubor |
| 🟢 velká komprimace (úspora místa) | 🔴 pomalý převod (vysoké zatížení CPU) | 🟢 malý výsledný soubor |
Možnosti komprimace
Podstatná je hodnota parametru -preset určující míru komprimace:
| hodnota parametru | výsledný soubor | určení |
| ultrafast | 🔴 velmi velký | testy, realtime stream (velmi rychlá komprimace) |
superfast |
🔴 velký | rychlý náhled, méně důležité video |
veryfast |
🟠 větší o 10–20 % | živé streamování, rychlý převod |
faster |
🟠 o něco větší | kompromis |
fast |
🟡 skoro stejný | běžné použití |
medium |
🟡 vyvážené | univerzální, doporučený standard |
slow |
🟢 menší (−10–20 %) | archivace, web |
slower |
🟢 ještě menší | web, velká komprese (pomalá komprimace) |
veryslow |
🟢🟢 už jen o málo menší než u slower |
již neefektivní úspora vůči velmi pomalé komprimaci |
Příklad komprimace pro Web
Převod souboru na úsporný formát:
- taskset -c 0-3 – omezení zpracování na 4 CPU vlákna
- -vf scale=800:450 – rozlišení 800×450
- -crf 30 – kvalita obrazu (vyšší číslo – nižší kvalita)
- -preset slow – míra komprese
💻 taskset -c 0-3 ffmpeg -i zdrojový_soubor.mp4 -c:v libx264 -vf scale=800:450 -crf 30 -preset slow cílový_soubor__web.mp4
Video s pevným snímkováním bývá požadováno například ve střihovém studiu Kdenlive a lze připravit příkazem:
💻 ffmpeg -i zdrojový_soubor.mp4 -vf "fps=25" -c:v libx264 -preset fast -crf 25 -c:a copy cílový_soubor.25fps.mp4
Pro soubory v dresáři dle masky *.mp4 a s dotazovým promptem pro přepis existujícího cíle:
💻 for x in *.mp4; do ffmpeg -i "$x" -vf "fps=25" -c:v libx264 -preset fast -crf 25 -c:a copy "${x%.mp4}.25fps.mp4" ;done
💻 ffmpeg -i zdrojový_soubor.mp4 cílový_soubor.mp3
s úpravou zesílení hlasitosti +8dB a ubrání výšek -6dB od 8kHz.
💻 ffmpeg -i zdrojový_soubor.mp4 -filter:a "volume=+8dB,treble=gain=-6dB:frequency=8000" cílový_soubor.mp3
💻 ffmpeg -i zdrojový_soubor.avi cílový_soubor.mp4
Převod s vymazáním metadat
💻 ffmpeg -i zdrojový_soubor.avi -metadata title="" cílový_soubor.mp4
💻 ffmpeg -i zdrojový_soubor.mp4 -ac 2 -c:v copy cílový_soubor.mp4
Převod s procentuálním poskládáním stereo kanálů levý = středový + 30% levý přední + 30% levý zadní a pravý = středový + 30% pravý přední + 30% pravý zadní
💻 ffmpeg -i zdrojový_soubor.mp4 -filter_complex "[0:a]pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR" -c:v copy cílový_soubor.mp4
Nastavení na 8 fps a rozlišení 160×120 px
💻 ffmpeg -i zdrojový_soubor.gif -r 8 -vf "scale=160x120" cílový_soubor.gif
Převod s vymazáním metadat
💻 ffmpeg -i zdrojový_soubor.gif -metadata title="" cílový_soubor.mp4
Převod s předvoleným video/audio kodekem a kvalitou
💻 ffmpeg -i zdrojový_soubor.avi -vcodec libx264 -crf 24 -acodec libmp3lame -b:a 128k -ac 2 cílový_soubor.mp4
Princip oříznutí a posun obrazu, „scale“ pro výslednou velikost obrazu
… -vf „crop={ořez_X}:{ořez_Y}[:{posun_zleva_X}[:{posun_shora_Y}]][,scale={rozměr_X}x{rozměr_Y}]“ …
Příklad oříznutí s vycentrováním a změnou rozměru
… -vf „crop=in_w-0:in_h-148:(in_w-out_w)/2+0:(in_h-out_h)/2+1,scale=1024×576“ …
Bez překódování a ve stupních 90, 180, 270:
💻 ffmpeg -i zdrojový_soubor.mp4 -metadata:s:v rotate="90" -codec copy cílový_soubor.mp4
Překódováním dle parametru transpose 1=90°, 2=180°, 3=270° :
💻 ffmpeg -noautorotate -i zdrojový_soubor.mp4 -vf "transpose=1,scale=-1:720,pad=1280:720:(ow-iw)/2:(oh-ih)/2" -c:v libx264 -crf 25 -preset slow -c:a copy -map_metadata 0 -metadata:s:v:0 rotate=0 cílový_soubor.mp4
nebo
💻 ffmpeg -noautorotate -i zdrojový_soubor.mp4 -vf "transpose=1,scale=-1:720,pad=1280:720:(ow-iw)/2:(oh-ih)/2" -c:v libx264 -crf 25 -preset slow -c:a copy -map_metadata -1 -movflags +faststart cílový_soubor.mp4
Připojení DVD, zjištění souborů a formátu potřebného videa. Reklamy, bonusy a pauzy jsou nejmenší soubory
💻 sudo mount /dev/sr0 /mnt
💻 ll /mnt/VIDEO_TS/
💻 ls -l /mnt/VIDEO_TS/VTS_*
💻 ffprobe /mnt/VIDEO_TS/VTS_...
Příklad: „720×576 – 5:4“ video soubor => oříznutí svislých okrajů => převod na „1024×768 – 4:3“
💻 cat /mnt/VIDEO_TS/VTS_01_[1-9].VOB | ffmpeg -y -i - -metadata title="" -vcodec libx264 -vf "crop=in_w-24:in_h:(in_w-out_w)/2-4,scale=1024x768" -crf 26 -deinterlace -preset veryfast -acodec libmp3lame -b:a 128k -ac 2 cílový_soubor.mp4
Příklad: „720×576 – 5:4“ video soubor => oříznutí vodorovných okrajů => převod na „1024×576 – 16:9“
💻 cat /mnt/VIDEO_TS/VTS_01_[1-9].VOB | ffmpeg -y -i - -metadata title="" -vcodec libx264 -vf "crop=in_w-0:in_h-146:(in_w-out_w)/2+0:(in_h-out_h)/2+1,scale=1024x576" -crf 26 -deinterlace -preset veryfast -acodec libmp3lame -b:a 128k -ac 2 cílový_soubor.mp4
Příklad: Přemapování audio kanálu -map 0:1 => -map 0:3
💻 cat /mnt/VIDEO_TS/VTS_01_[1-9].VOB | ffmpeg -y -i - -metadata title="" -map 0:1 -vcodec libx264 -crf 26 -deinterlace -preset veryfast -acodec libmp3lame -map 0:3 -b:a 128k -ac 2 cílový_soubor.mp4
Příklad: Poskládání obrazu ze dvou webkamer (s předem nastaveným rozlišením 640×480) do tří sekcí.
horní:
/dev/video0 [0:v](640x480) -> [horni](640×200),
dolní + lupa:
/dev/video1 [1:v](640x480) -> [dolni](640×280) + [lupa](140×280)
💻 ffmpeg -f video4linux2 -r 15 -input_format mjpeg -i /dev/video0 -f video4linux2 -r 15 -input_format mjpeg -i /dev/video1 -filter_complex "[0:v]setpts=PTS-STARTPTS,crop=in_w:200:0:0[horni]; [1:v][horni]overlay=0:0[dolni]; [1:v]setpts=PTS-STARTPTS,crop=70:250:70:230,scale=140:280[lupa]; [dolni][lupa]overlay=0:200" -an -c:v h264 -bufsize 2M -maxrate 512K -f asf - | mplayer -
Příklad separace úseku zvuku (od 12,5 sec. po dobu 180 sec) do mp3 souboru s korekcí basů a výšek
💻 ffmpeg -y -ss 12.5 -t 180 -i videosoubor_zdroj.mp4 -vcodec copy -preset veryfast -acodec libmp3lame -af "bass=gain=3,treble=gain=-10:frequency=8000" -b:a 128k -ac 2 cílový_soubor.mp3
Příklad zeslabení hlasitosti ve video souboru o 12dB
💻 ffmpeg -y -i videosoubor_zdroj.mp4 -vcodec copy -filter:a "volume=-12dB" cílový_soubor.mp4
prvně, vytvořit si virtuální webkameru /dev/video10 a do této posílat klíčované video z fyzické webkamery /dev/video0 na pozadí tvořené obrázkem Picture.jpg .
💻 ffmpeg -nostdin -i 'Picture.jpg' -f v4l2 -input_format mjpeg -video_size 1280x720 -i /dev/video0 -filter_complex " [0:v]scale=1280x720[bg]; [1:v]scale=1280x720,chromakey=color=#326964:0.07:0.02,fps=30[fg]; [bg][fg]overlay" -crf 28 -deinterlace -preset ultrafast -f v4l2 -pix_fmt yuv420p /dev/video10
Zobrazení virtuální kamery /dev/video10
💻 ffplay /dev/video10 -loglevel quiet -x 960 -y 540 -window_title "Zobrazení virtuální kamery /dev/video10"
Popis
ffmpeg je schopen plně využít procesor. Lze ale procesu přidělit jen určitý počet vláken jader pomocí předřazeného příkazu taskset s parametrem rozsahu vláken.
Příklad
Omezení běhu procesu s ffmpeg jen na 4 vlákna jader procesoru:
💻 taskset -c 0-3 ffmpeg ...
