Cómo recortar imágenes y videos con FFmpeg
Usa el filtro crop de FFmpeg para conservar una parte rectangular de una imagen o de cada fotograma de video.
Por ejemplo, crop=200:200:50:50 conserva una región de 200×200 que comienza a 50 píxeles del borde
izquierdo y a 50 píxeles del borde superior. A continuación, recortarás un JPEG y un MP4, comprobarás
sus dimensiones y aplicarás el recorte de imagen a un directorio con Bash.
Prepara FFmpeg y tus archivos
Ejecuta los ejemplos en Bash en macOS o Linux. Instala una compilación que incluya ffmpeg, ffprobe
y el codificador libx264 con los enlaces por plataforma de la
página de descargas de FFmpeg. Los comandos se probaron con
FFmpeg 9.0.1 en macOS y 6.1.1 en Ubuntu 24.04.
Comprueba tu instalación:
ffmpeg -version && ffprobe -version && ffmpeg -hide_banner -h encoder=libx264
El último comando debería listar las capacidades del codificador. Si informa que el codificador es
desconocido, instala una compilación con libx264 antes de continuar.
Coloca un JPEG con la orientación correcta llamado input.jpg y un MP4 llamado input.mp4 en tu directorio de trabajo.
El ejemplo de imagen necesita al menos 250×250 píxeles; el recorte de video fijo necesita al menos
1280×720. Los ejemplos de video asumen video SDR normal con píxeles cuadrados y sin metadatos de
rotación. Recortar material HDR o anamórfico requiere un manejo adicional del color o de la relación
de aspecto.
Los comandos de un solo archivo usan -y: volver a ejecutarlos reemplaza los archivos de salida con esos nombres.
Elige un nombre de salida distinto para conservar un resultado anterior y mantén los nombres de
salida diferentes de los de tus entradas. -nostdin desactiva la interacción por teclado, por lo que
los comandos también funcionan de forma desatendida.
Consulta las opciones de comandos de FFmpeg.
Elige el rectángulo de recorte
La sintaxis del filtro es crop=width:height:x:y. Las coordenadas comienzan en (0,0) en la esquina superior
izquierda; x aumenta hacia la derecha y y hacia abajo. El recorte elimina los píxeles fuera del
rectángulo sin redimensionar su contenido.
Para que el rectángulo quede dentro de la entrada, usa dimensiones positivas y desplazamientos no
negativos, con x + width no mayor que el ancho de la entrada y y + height no mayor que su alto.
Comprueba tú mismo estos límites: FFmpeg puede ajustar un desplazamiento fuera de rango para que el
rectángulo encaje en lugar de informar un error.
Puedes omitir x y y para centrar el recorte. En entradas con submuestreo de croma, el filtro
normalmente redondea hacia abajo las coordenadas y las dimensiones hasta la cuadrícula de
submuestreo. Los ejemplos siguientes usan valores pares para el formato 4:2:0 habitual. La
referencia de crop de FFmpeg documenta estos valores predeterminados y
la opción exact para recortes que necesitan coordenadas impares.
Recortar imágenes con FFmpeg
Recorta el rectángulo descrito arriba y guárdalo como cropped.png:
ffmpeg -hide_banner -nostdin -y -pattern_type none -i input.jpg \
-vf "crop=200:200:50:50" -frames:v 1 -update 1 cropped.png
-frames:v 1 escribe una sola imagen. PNG evita otra codificación JPEG con pérdida después del recorte.
-pattern_type none hace que el nombre del archivo de entrada sea literal, mientras que -update 1 hace lo mismo con
el nombre del archivo de salida. Esas opciones también importan cuando un nombre de archivo contiene %03d,
que de lo contrario FFmpeg trataría como un patrón de secuencia de imágenes. Estos comportamientos
están documentados en las opciones de entrada de imagen
y las opciones de salida de imagen.
Comprueba las dimensiones de salida con ffprobe:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height \
-of csv=p=0:s=x cropped.png
Esto debería imprimir 200x200. Abre también el PNG: las dimensiones por sí solas no te dicen si
conservaste el sujeto deseado.
Recortar videos con FFmpeg
Conserva la región de 1280×720 de la esquina superior izquierda en cada fotograma de input.mp4:
ffmpeg -hide_banner -nostdin -y -i input.mp4 \
-map 0:v:0 -map '0:a:0?' -vf "crop=1280:720:0:0" \
-c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -b:a 128k cropped.mp4
La salida contiene video H.264 y, cuando está presente, la primera pista de audio codificada como
AAC. El ? entrecomillado hace que el mapeo de audio sea opcional, por lo que las entradas
sin sonido también funcionan. Se omiten las pistas de video y de audio adicionales, así como los
subtítulos. Consulta la
documentación sobre el mapeo de streams.
Recortar requiere decodificar y volver a codificar el video, por lo que -c:v copy no se puede combinar
con este filtro. -crf 18 es un ajuste de calidad para la codificación H.264 con pérdida.
-pix_fmt yuv420p selecciona salida 4:2:0, que requiere un ancho y un alto pares con este codificador.
Recorta un cuadrado centrado
Tanto para video horizontal como vertical, elige la menor dimensión de la entrada y redondéala hacia abajo a un número par:
ffmpeg -hide_banner -nostdin -y -i input.mp4 \
-map 0:v:0 -map '0:a:0?' -vf "crop=w='trunc(min(iw,ih)/2)*2':h=ow" \
-c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -b:a 128k square.mp4
Aquí, iw e ih son las dimensiones de la entrada, y ow es el ancho de recorte calculado.
Omitir x y y centra el cuadrado, sujeto al redondeo a la cuadrícula de croma descrito
arriba. Una entrada de 1920×1080 produce 1080×1080 píxeles. Este es un recorte central fijo, por lo
que un sujeto cercano a un borde aún puede quedar cortado.
Verifica la salida de video
Inspecciona las dimensiones y los códecs con las
entradas seleccionadas de ffprobe:
ffprobe -v error -show_entries stream=codec_type,codec_name,width,height \
-of json cropped.mp4
Espera un stream de video h264 con ancho 1280 y alto 720, además de un stream aac si
la entrada tenía audio. Reemplaza cropped.mp4 por square.mp4 para comprobar el recorte cuadrado.
Reproduce el resultado para comprobar el encuadre y el sonido a lo largo de todo el clip.
Recorta imágenes JPEG por lotes
Guarda esto como crop-images.sh y ejecuta bash crop-images.sh desde el directorio que contiene
tus archivos JPEG. Procesa los archivos no ocultos de ese directorio que terminan en .jpg en minúsculas,
con el mismo recorte de 200×200 en (50,50). Cada entrada debe cumplir el mínimo de 250×250 para
ese rectángulo.
#!/usr/bin/env bash
set -euo pipefail
shopt -s nullglob
images=(./*.jpg)
if (( ${#images[@]} == 0 )); then
printf '%s\n' 'No .jpg files found.' >&2
exit 1
fi
mkdir ./cropped
for image in "${images[@]}"; do
name=${image##*/}
ffmpeg -hide_banner -loglevel error -nostdin -y \
-pattern_type none -i "$image" -vf "crop=200:200:50:50" \
-frames:v 1 -update 1 "./cropped/${name%.jpg}.png"
done
El script requiere un directorio cropped nuevo: si ya existe, mkdir falla y
el script se detiene antes de procesar nada. Conserva los resultados de ese directorio y elige
un nuevo directorio de salida en el script para otra ejecución. Las salidas son PNG en un
subdirectorio, por lo que no pueden convertirse en entradas en la siguiente ejecución.
El entrecomillado y el prefijo ./ manejan los espacios y los guiones iniciales en los nombres
de archivo; las opciones de imagen manejan los patrones de porcentaje literales en ambos lados. Un
directorio vacío produce un error. Si FFmpeg falla con una imagen ilegible o con un recorte que no
cabe en la imagen, el script se detiene; los archivos ya escritos permanecen en cropped, así que
inspecciona cualquier resultado parcial antes de reintentar.
