Script para macOS que convierte archivos MP4 en animaciones en bucle estilo GIF WebP con un solo clic.

Resumir con IA

Para el trabajo de desarrollo de aplicaciones y clientes, a menudo necesito Visualiza rápidamente el contenido de vídeo.:

  • Animaciones de vista previa para gerentes de producto
  • Clips de demostración para documentos o PRD
  • Animación ligera para publicaciones en redes sociales o páginas de destino.

En estos casos, Extraer algunos fotogramas clave de un archivo MP4 y convertirlos en una animación WebP en bucle. Normalmente es suficiente, y mucho más ligero que subir un vídeo completo.

Este artículo comparte una Script de shell de un solo clic para macOS eso:

  • Extrae entre 6 y 12 fotogramas espaciados uniformemente de un archivo MP4.
  • los redimensiona a un ancho de 720 píxeles
  • crea una animación WebP en bucle
  • y se instala automáticamente ffmpeg si falta

Todo esto se ejecuta mediante un único comando en la terminal.


1. Qué hace el guion

En macOS, el script extraer_fotogramas_inpares_webp.sh proporciona:

  1. Automático ffmpeg detección e instalación
    • Comprueba si ffmpeg está disponible
    • Si no, instala Homebrew (si es necesario) y luego instala ffmpeg
  2. Extracción de fotogramas uniformes
    • Calcula la duración del vídeo
    • Muestras uniformes 6–12 fotogramas a lo largo de todo el vídeo
    • Por defecto son 6 fotogramas, pero puedes personalizar el número.
  3. Generación de animación WebP
    • Combina los fotogramas PNG extraídos en un WebP en bucle
    • El ancho de salida es 720 píxeles Por defecto (la altura se ajusta proporcionalmente)
    • La calidad es ajustable mediante -q:v
  4. Limpieza automática
    • Almacena los fotogramas intermedios en un directorio temporal.
    • Elimina el directorio temporal después de que se genere el archivo WebP.
  5. Funciona tanto con vídeos cortos como largos.
    • Si el vídeo es muy corto, el número de fotogramas se reduce automáticamente.
    • Para vídeos más largos, los fotogramas siempre están espaciados uniformemente a lo largo de toda la duración.

2. Cómo funciona internamente

Esta es la lógica básica detrás del script.

2.1 Comprobar dependencias

El script primero comprueba si ffmpeg está instalado:

  • Usos comando -v ffmpeg
  • Si no se encuentra, comprueba elaborar cerveza
    • Si falta Homebrew, lo instala.
    • Luego usa brew install ffmpeg para instalar ffmpeg

2.2 Recuperar la duración del video

Usando ffprobe, el guion lee el duración total del vídeo en segundos.
En función de esto y del número de fotogramas deseado, calcula el intervalo de tiempo entre fotogramas.

2.3 Muestrear uniformemente los fotogramas

Para cada índice de fotograma, sucede lo siguiente:

  • Calcula la marca de tiempo = índice × intervalo
  • Usos ffmpeg -ss saltar a esa posición temporal
  • Extrae exactamente un fotograma.
  • Lo escala con escala=720:-1 Por lo tanto, el ancho es de 720px y la altura es proporcional.

2.4 Construir la animación WebP

Una vez que todos los fotogramas se guardan como PNG, el script llama ffmpeg nuevamente a:

  • Léalos en orden (%03d.png)
  • Codifícalos como un archivo WebP animado.
  • Colocar -bucle 0 por lo que la animación se repite indefinidamente
  • Controlar la calidad con -q:v 70 (Menor valor = mayor calidad, archivo más grande)

2.5 Limpieza

Todos los archivos PNG intermedios se almacenan en un directorio temporal creado por mktemp -d.
Después de que se genera el WebP, ese directorio se elimina con rm -rf.


3. Script de shell completo: extract_even_frames_webp.sh

Puedes guardar el siguiente script como extraer_fotogramas_inpares_webp.sh En tu Mac:

#!/bin/bash

# Usage: ./extract_even_frames_webp.sh input.mp4 output.webp [frames]
# frames is optional, default 6, maximum 12

INPUT="$1"
OUTPUT="$2"
FRAMES="${3:-6}"

# Cap maximum frames at 12
if [ "$FRAMES" -gt 12 ]; then
    FRAMES=12
fi

if [ -z "$INPUT" ] || [ -z "$OUTPUT" ]; then
    echo "Usage: $0 input.mp4 output.webp [frames]"
    exit 1
fi

# ---------------------------------
# 1️⃣ Check ffmpeg
# ---------------------------------
if ! command -v ffmpeg >/dev/null 2>&1; then
    echo "⚠️ ffmpeg not found, starting installation..."
    if ! command -v brew >/dev/null 2>&1; then
        echo "⚠️ Homebrew not found, installing Homebrew..."
        /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
        echo "✅ Homebrew installed"
    else
        echo "✅ Homebrew already installed"
    fi
    brew update
    brew install ffmpeg
    if ! command -v ffmpeg >/dev/null 2>&1; then
        echo "❌ ffmpeg installation failed, please check manually"
        exit 1
    fi
    echo "🎉 ffmpeg installed successfully!"
else
    echo "✅ ffmpeg is already installed"
fi

# ---------------------------------
# 2️⃣ Get video duration
# ---------------------------------
DURATION=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$INPUT")
if [[ -z "$DURATION" ]]; then
    echo "❌ Failed to get video duration"
    exit 1
fi
DURATION=${DURATION%.*}  # integer seconds

# If video is shorter than requested frames, match frame count to duration
if [ "$DURATION" -lt "$FRAMES" ]; then
    FRAMES=$DURATION
fi

echo "📹 Video length: ${DURATION}s, extracting $FRAMES frames evenly"

# ---------------------------------
# 3️⃣ Create temporary directory
# ---------------------------------
TMPDIR=$(mktemp -d)

# ---------------------------------
# 4️⃣ Calculate interval
# ---------------------------------
INTERVAL=$(echo "scale=6; $DURATION/$FRAMES" | bc)
echo "⏱ Frame interval: $INTERVAL seconds"

# ---------------------------------
# 5️⃣ Extract frames
# ---------------------------------
for i in $(seq 0 $(($FRAMES-1))); do
    TIME=$(echo "$i * $INTERVAL" | bc)
    printf -v FILENAME "%03d.png" $((i+1))
    ffmpeg -ss "$TIME" -i "$INPUT" -frames:v 1 -vf "scale=720:-1" \
        "$TMPDIR/$FILENAME" -hide_banner -loglevel error
done

# ---------------------------------
# 6️⃣ Generate animated WebP
# ---------------------------------
ffmpeg -y -i "$TMPDIR/%03d.png" -vcodec libwebp -lossless 0 -q:v 70 \
    -loop 0 -preset picture "$OUTPUT" -hide_banner -loglevel error

# ---------------------------------
# 7️⃣ Clean up
# ---------------------------------
rm -rf "$TMPDIR"

echo "🎉 Done! Generated file: $OUTPUT"

4. Cómo usar el script en macOS

  1. Guarda el script Guarda el contenido anterior como extraer_fotogramas_inpares_webp.sh, por ejemplo, en su directorio personal.
  2. Dale permiso de ejecución
chmod +x extract_even_frames_webp.sh
  1. Uso básico
./extract_even_frames_webp.sh input.mp4 output.webp

Esto hará:

  • Compruebe o instale ffmpeg
  • Extraer 6 fotogramas espaciados uniformemente
  • Generar salida.webp con un ancho de 720 píxeles
  1. Especifique el número de fotogramas (6–12)
./extract_even_frames_webp.sh input.mp4 output.webp 8

Esto extraerá 8 fotogramas en lugar de los 6 predeterminados.


5. Por qué este flujo de trabajo es útil

En comparación con abrir manualmente un editor de vídeo o navegar por un convertidor con interfaz gráfica de usuario, este script tiene algunas ventajas:

  1. Configuración manual cero
    • Se instala automáticamente ffmpeg (y Homebrew si es necesario)
    • No es necesario buscar instaladores ni recordar comandos.
  2. Muestreo de fotogramas inteligentes
    • Para clips cortos, reduce automáticamente el número de fotogramas.
    • Para vídeos más largos, los fotogramas siempre se espacian uniformemente a lo largo de la duración.
  3. Control de calidad y tamaño
    • -q:v te permite ajustar la calidad de WebP en función del tamaño del archivo.
    • escala=720:-1 proporciona un ancho compatible con la web y una relación de aspecto consistente.
  4. Bucle por defecto
    • -bucle 0 Hace que la animación WebP se reproduzca en bucle indefinidamente.
    • Ideal para previsualizaciones, demostraciones y animaciones sutiles en documentos o sitios web.
  5. Uso limpio del disco
    • Los marcos PNG temporales se almacenan en una carpeta temporal y se eliminan posteriormente.
    • No se acumulan archivos residuales con el tiempo.

6. Ejemplo: convertir un archivo MP4 de 20 segundos en una vista previa WebP.

Imagina que tienes un Vídeo de demostración de 20 segundos y correr:

./extract_even_frames_webp.sh demo.mp4 demo-preview.webp 6

El guion dirá:

  • Calcula un intervalo de aproximadamente 3,33 segundos
  • Extraer 6 fotogramas en 0s, 3,33s, 6,66s, 10s, 13,33s, 16,66s
  • Redimensionarlos a un ancho de 720 píxeles.
  • Construye un WebP en bucle animación

Luego puedes colocar este archivo WebP en:

  • Documentos del producto o documentos de Feishu / Notion como vista previa ligera
  • Publicaciones en redes sociales o páginas de destino como miniatura de movimiento de reproducción automática
  • Presentaciones de PowerPoint y demostraciones internas donde un video completo sería excesivo.

7. Ideas para la ampliación

Este script es un punto de partida; puedes adaptarlo fácilmente a tu propio flujo de trabajo:

  1. Recuento de fotogramas dinámico
    • Seleccionar automáticamente entre 6 y 12 fotogramas en función de la duración del vídeo.
    • Por ejemplo, más fotogramas para clips más largos para mostrar más estados.
  2. Tamaños personalizados
    • Cambiar escala=720:-1 al ancho que prefiera su equipo de producto
    • O bien, exponer el ancho como un parámetro: ./script.sh in.mp4 out.webp 8 1080
  3. Procesamiento por lotes
    • Envuelva este script en otro bucle para procesar todo .mp4 archivos en una carpeta
    • Útil cuando exportas un lote de demostraciones de funciones a la vez.

Nota del autor

Este script proviene de mi flujo de trabajo real de desarrollo en macOS para convertir vídeos MP4 en previsualizaciones WebP ligeras. Lo uso a diario en el desarrollo para clientes para generar animaciones de demostración para documentación y publicaciones en redes sociales. GPT solo se utilizó para ayudar a traducir, estructurar y perfeccionar la versión en inglés de este artículo; la lógica del script, los detalles de implementación y los patrones de uso provienen de mi propia experiencia en proyectos.

Acerca del autor

Compartir publicación:

Mantente conectado

Más actualizaciones