Ritaglio Video con FFmpeg: Guida Completa ai Comandi con Esempi
Il filtro crop di FFmpeg è il coltellino svizzero per il ritaglio video programmato. È veloce, senza perdita (con il codec giusto), e scriptabile. Padroneggia la sintassi ed evita le insidie comuni.
Sintassi di Base
ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output.mp4
- w = larghezza output
- h = altezza output
- x = offset orizzontale dall'alto-sinistra (0 = bordo sinistro)
- y = offset verticale dall'alto-sinistra (0 = bordo superiore)
Tutti i valori in pixel. La valutazione delle espressioni consente calcoli (vedi sotto).
Metodo 1: Coordinate Pixel Esplicite
Ritaglia una finestra 1280x720 partendo da (100, 50) da una sorgente 1920x1080:
ffmpeg -i input.mp4 -vf "crop=1280:720:100:50" -c:a copy output.mp4
-c:a copy= Copia flusso audio (nessuna ricodifica, veloce, nessuna perdita di qualità).- Il video verrà ricodificato (il ritaglio cambia i pixel). Usa
-c:v libx264 -crf 18 -preset slowper alta qualità.
Metodo 2: Ritaglio Relativo/Centrato (Espressioni)
Usa iw (larghezza input) e ih (altezza input) per comandi indipendenti dalla risoluzione.
Ritaglio Centrato (Il Più Comune)
# Ritaglia centro 75% larghezza x 75% altezza ffmpeg -i input.mp4 -vf "crop=iw*0.75:ih*0.75:(iw-ow)/2:(ih-oh)/2" -c:a copy output.mp4
ow/oh= larghezza/altezza output (calcolate dai primi due argomenti).(iw-ow)/2centra orizzontalmente.(ih-oh)/2centra verticalmente.
Conversione Proporzioni (16:9 → 9:16 Verticale)
# Ritaglia centro verticale 9:16 da 16:9 (es. 1920x1080 -> 607x1080) ffmpeg -i input.mp4 -vf "crop=ih*9/16:ih:(iw-ow)/2:0" -c:a copy vertical.mp4
Rimuovi Barre Nere (Auto-Rilevamento)
# Rileva bordi neri per 1 sec, poi ritaglia ffmpeg -i input.mp4 -vf "cropdetect=24:16:0" -f null - 2>&1 | grep crop | tail -1 # Esempio output: [Parsed_cropdetect_0 @ 0x...] crop=1920:800:0:140 # Usa i valori rilevati: ffmpeg -i input.mp4 -vf "crop=1920:800:0:140" -c:a copy output.mp4
Metodo 3: Basato su Percentuale (Social Media Veloce)
# Ritaglia centro 80% larghezza, 90% altezza ffmpeg -i input.mp4 -vf "crop=iw*0.8:ih*0.9:(iw-ow)/2:(ih-oh)/2" output.mp4
Avanzato: Ritaglio Variabile nel Tempo (Keyframed / Animato)
Usa il filtro sendcmd o crop con espressioni t (timestamp).
# Zoom da fotogramma completo a centro 50% in 5 secondi ffmpeg -i input.mp4 -vf " crop= w='iw*max(0.5,1-0.1*t)': h='ih*max(0.5,1-0.1*t)': x='(iw-ow)/2': y='(ih-oh)/2' " -c:a copy zoom_crop.mp4
t = secondi. A t=0: 100%. A t=5: 50%. Easing lineare.
Insidie Critiche
| Problema | Causa | Soluzione |
|---|---|---|
| Dimensioni output non divisibili per 2 | H.264/HEVC richiedono larghezza/altezza pari | Usa crop='if(gt(iw,ih),-2,ih*9/16)':... o assicurati matematica pari. FFmpeg auto-aggiusta con +0 ma avvisa. |
| Ritaglio supera input | x+w > iw o y+h > ih | Valida con ffprobe -v error -select_streams v:0 -show_entries stream=width,height input.mp4 |
| Proporzioni sembrano stirate | Player ignora SAR / DAR | Aggiungi -vf "crop=...,setsar=1" o -aspect 16:9 in output. |
| Perdita di qualità | Ricodifica default (CRF 23) | Esplicito -c:v libx264 -crf 18 -preset slow (o -c:v copy se SOLO ritaglio I-frame? No, il crop ricodifica sempre). |
| Deriva audio | Ricodifica video cambia durata leggermente | -c:a copy sempre. Se sincronia critica, usa -async 1. |
Flusso di Lavoro Pro: Ritaglio Batch Cartella
# Bash / Zsh / PowerShell for f in *.mp4; do ffmpeg -i "$f" -vf "crop=ih*9/16:ih:(iw-ow)/2:0" -c:v libx264 -crf 20 -preset medium -c:a copy "cropped_${f}" done
Esegui sempre ffprobe prima. Scripta la matematica. Usa -c:a copy. Archivia gli originali.