Communitygithub.com

Composición de video — Ensamblaje, audio, codificación y valida…

Ensambla, mezcla, normaliza y valida videos terminados a partir de fuentes como Blender, Remotion, Manim, captura de pantalla y audio, usando FFmpeg y FFprobe. Ideal para combinar escenas, corregir resoluciones dispares, añadir música/voz, incrustar subtítulos, exportar GIF/miniaturas y generar codificaciones específicas para plataformas.

¿Qué es Composición de video — Ensamblaje, audio, codificación y valida…?

Esta habilidad proporciona un flujo de trabajo completo y profesional para la postproducción de video mediante FFmpeg y FFprobe. Está diseñada para ensamblar, normalizar y validar contenido creado en herramientas como Blender, Remotion, Manim y capturas de pantalla. Cubre desde la normalización de propiedades incompatible (resolución, FPS, formato de píxel, audio) hasta la concatenación, superposición con alpha, composición picture-in-picture, mezcla de audio con ducking, normalización de sonoridad (loudnorm), incrustación de subtítulos (hard/soft) y codificación para plataformas como YouTube o redes sociales. También incluye generación de contact sheets y GIF de alta calidad, así como validaciones automatizadas (detección de fotogramas negros o congelados, nivel de audio) para garantizar que el archivo final sea correcto. Está pensada para agentes como Claude Code, Cursor y Codex, y se apoya en documentos de referencia como FFMPEG-COOKBOOK.md y scripts de validación.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aminghaseminia/blender-animation-skill/tree/HEAD/skills/video-composition

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Composición de video — Ensamblaje, audio, codificación y validación

FFmpeg es la capa de entrega, no una herramienta de diseño. Debe recibir escenas ya diseñadas y producir un master limpio más las codificaciones para plataformas.

Consulte references/FFMPEG-COOKBOOK.md para comandos listos para copiar y scripts/validate.sh para una comprobación previa a la entrega.

Regla cero: sondear primero. Construir un grafo de filtros asumiendo propiedades de flujo incorrectas es la causa más común de salida rota.

ffprobe -v error -show_streams -show_format -of json input.mp4

1. Normalizar antes de combinar

Entradas incompatibles causan vibración, silencio, desvío y halos. Antes de cualquier ensamblaje con múltiples fuentes, haga que todas las entradas coincidan en:

PropiedadObjetivo
Resoluciónmaster del proyecto (ej. 1920×1080)
Relación de aspecto de píxel1:1
Fotogramas por segundoFPS del proyecto, constante
Base de tiempoconsistente
Formato de píxelyuv420p para entrega, yuva444p10le/PNG para alpha
Espacio de color / transferenciaun estándar; etiquételo
Audio48 kHz, estéreo, códec consistente
ffmpeg -i in.mp4 -vf "scale=1920:1080:flags=lanczos,fps=30,setsar=1" \
  -c:v libx264 -crf 14 -preset fast -pix_fmt yuv420p \
  -c:a aac -ar 48000 -ac 2 -b:a 256k normalized.mp4

Mantenga los intermedios en alta calidad (CRF 12–16 o ProRes). Codifique la versión de entrega una sola vez.

2. Concatenación

Mismo códec, tamaño, FPS, formato de píxel y diseño de audio → copia de flujo, rápida y sin pérdidas:

printf "file 'shot_01.mp4'\nfile 'shot_02.mp4'\n" > list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy final.mp4

Cualquier otra cosa → grafo de filtros:

ffmpeg -i a.mp4 -i b.mp4 -filter_complex \
  "[0:v]scale=1920:1080,fps=30,setsar=1[v0]; \
   [1:v]scale=1920:1080,fps=30,setsar=1[v1]; \
   [v0][0:a][v1][1:a]concat=n=2:v=1:a=1[v][a]" \
  -map "[v]" -map "[a]" -c:v libx264 -crf 16 -pix_fmt yuv420p -c:a aac final.mp4

Nunca copie flujo para concatenar entradas no coincidentes. "Tiene éxito" y produce reproducción rota.

3. Superposición, alpha y picture-in-picture

# elemento transparente sobre un fondo
ffmpeg -i bg.mp4 -i logo.mov -filter_complex \
  "[0:v][1:v]overlay=W-w-48:48:format=auto" -c:v libx264 -crf 16 out.mp4

# picture-in-picture, fuente escalada y redondeada
ffmpeg -i main.mp4 -i insert.mp4 -filter_complex \
  "[1:v]scale=640:-2[pip];[0:v][pip]overlay=W-w-40:H-h-40" out.mp4

Reglas de alpha:

  • H.264/MP4 no puede transportar alpha. Use secuencia PNG, ProRes 4444 o WebM/VP9 con alpha.
  • Verifique el alpha sobre un fondo contrastante después de cada etapa.
  • Cuidado con los halos de alpha premultiplicado vs. recto en bordes oscuros; siga la convención del motor de renderizado.

4. Audio

# fondo musical con fundido y ducking bajo voz
ffmpeg -i video.mp4 -i music.mp3 -i voice.wav -filter_complex \
  "[1:a]volume=0.35,afade=t=in:st=0:d=1,afade=t=out:st=28:d=2[bed]; \
   [2:a]volume=1.0[vo]; \
   [bed][vo]sidechaincompress=threshold=0.08:ratio=6:attack=8:release=250[duck]; \
   [duck][vo]amix=inputs=2:duration=first:dropout_transition=0[a]" \
  -map 0:v -map "[a]" -c:v copy -c:a aac -b:a 192k out.mp4
# medir sonoridad, luego normalizar
ffmpeg -i in.mp4 -af loudnorm=I=-14:TP=-1:LRA=11:print_format=json -f null -
ffmpeg -i in.mp4 -af loudnorm=I=-14:TP=-1:LRA=11 -c:v copy out.mp4

Los objetivos varían según el destino (-14 LUFS para muchas plataformas web, -23/-24 para radiodifusión). Mida, luego elija. Evite normalizar un archivo que ya está en el objetivo.

5. Subtítulos

# incrustar (subtítulos duros)
ffmpeg -i in.mp4 -vf "subtitles=captions.srt:force_style='FontName=Inter,FontSize=22,PrimaryColour=&H00FFFFFF,OutlineColour=&H80000000,BorderStyle=3,Outline=1,Shadow=0'" \
  -c:v libx264 -crf 18 -c:a copy out.mp4

# subtítulos suaves (pista transportable)
ffmpeg -i in.mp4 -i captions.srt -c copy -c:s mov_text -metadata:s:s:0 language=eng out.mp4

Verifique RTL: force_style con una fuente que admita shaping, Alignment correcto y una inspección de fotograma renderizado. Mantenga los subtítulos dentro de las áreas seguras y por encima de la interfaz de la plataforma.

6. Codificaciones para plataformas

# YouTube horizontal, 1080p30
ffmpeg -i master.mov -c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p \
  -profile:v high -level 4.1 -movflags +faststart \
  -c:a aac -b:a 192k -ar 48000 out_1080p.mp4

# red social vertical, 1080x1920
ffmpeg -i master.mov -vf "scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920" \
  -c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p -movflags +faststart \
  -c:a aac -b:a 192k out_vertical.mp4

# intermedio de alta calidad para composición posterior
ffmpeg -i master.mov -c:v prores_ks -profile:v 3 -pix_fmt yuv422p10le -c:a pcm_s24le master.mov

Verifique que el codificador existe: ffmpeg -encoders | grep -E "libx264|prores|nvenc". Los codificadores hardware son rápidos pero a menudo de menor calidad por bit; compare antes de enviar.

7. Fotogramas, contact sheets, GIF

# fotogramas en momentos específicos
ffmpeg -ss 00:00:03.5 -i in.mp4 -frames:v 1 frame.png

# hoja de contactos
ffmpeg -i in.mp4 -vf "fps=1,scale=320:-1,tile=4x4" -frames:v 1 sheet.jpg

# GIF de alta calidad (palettegen/paletteuse)
ffmpeg -i in.mp4 -vf "fps=15,scale=640:-1:flags=lanczos,palettegen" palette.png
ffmpeg -i in.mp4 -i palette.png -lavfi "fps=15,scale=640:-1:flags=lanczos[x];[x][1:v]paletteuse" out.gif

8. Validación (no la omita)

ffprobe -v error \
  -show_entries format=duration,size,bit_rate,format_name \
  -show_entries stream=index,codec_type,codec_name,width,height,r_frame_rate,avg_frame_rate,pix_fmt,channels,sample_rate,nb_frames \
  -of json final.mp4

Comprobaciones automatizadas:

# segmentos negros (fotogramas negros accidentales)
ffmpeg -i final.mp4 -vf "blackdetect=d=0.1:pix_th=0.05" -an -f null - 2>&1 | grep blackdetect || true

# segmentos congelados (pausa demasiado larga)
ffmpeg -i final.mp4 -vf "freezedetect=n=0.003:d=2" -an -f null - 2>&1 | grep freeze || true

# presencia de audio y nivel pico
ffmpeg -i final.mp4 -af volumedetect -f null - 2>&1 | grep -E "mean_volume|max_volume"

Luego inspeccione el primer fotograma, el último, cada transición y los fotogramas con mucho texto. Los números prueban que el archivo está bien formado; no prueban que luzca correcto.

9. Trampas de precisión de fotogramas

  • Fuentes VFR (grabaciones de pantalla, teléfonos) se desvían de una línea de tiempo CFR. Normalice con fps=30 y verifique la duración.
  • Error de uno: N fotogramas a 30 fps son exactamente N/30 segundos; un render de 300 fotogramas es 10.0 s. Si la duración es 9.97 s, se perdió un fotograma.
  • Audio truncado más corto que el video → silencio al final; añada padding o recorte deliberadamente.
  • Video de teléfono rotado lleva una matriz de visualización; -noautorotate solo si realmente lo necesita.
  • Cambio de color después de codificar: verifique las etiquetas color_primaries/transfer; una vista previa del navegador no es una referencia de color confiable.
  • Codificaciones repetidas degradan la calidad; mantenga un master de alta calidad y codifique a partir de él.

10. Paquete de entrega

output/
  final_1080p.mp4          # primario
  final_vertical.mp4       # variante de plataforma, si se solicita
  final_master.mov         # ProRes/H.264 CRF 14, conservado para futuras codificaciones
  thumbnail.png            # 1280x720 o 1080x1920
  contact-sheet.jpg
  captions.srt
  project-report.md        # versiones de herramientas, configuraciones, comprobaciones realizadas

Informe las propiedades exactas desde ffprobe; nunca las adivine.

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

aminghaseminia/blender-animation

Build 3D animations in Blender headlessly with Python (bpy) — scene setup, materials, lighting, camera rigs, keyframe and procedural animation, Geometry Nodes, particles and simulations, EEVEE/Cycles rendering, and MP4/PNG-sequence output. Triggers include "animate in Blender", "blender python", "bpy script", "3D logo animation", "cinematic render", "particle animation", "product turntable", "render an .blend", "blender headless", or any 3D scene, camera move, or motion graphics job that needs real geometry, light, and depth.

aminghaseminia/motion-studio

End-to-end animation and motion-graphics production from a natural-language brief. Routes work to Blender (3D), Remotion (2D/typography/data), Manim (math/science), motion-design craft, and FFmpeg (encode/composite/validate), then builds, previews, inspects, revises, and delivers an editable project plus final MP4. Use for any request to "make an animation", "create a video", "animate this logo", "render a motion graphic", "vibe-code an animation", or produce a promo, explainer, title sequence, or social clip.

aminghaseminia/remotion-motion-graphics

Create 2D motion graphics as code with Remotion and React — kinetic typography, logo reveals, explainers, animated charts, UI demos, social clips, subtitles, and data-driven or batch-rendered video. Use when the deliverable is primarily layout, text, and 2D graphics rather than real 3D; when a video must be generated from data or a template; or when a Blender 3D pass needs titles, captions, and transitions composited on top. Covers project setup, deterministic frame-based animation, easing, typography, audio, rendering, and licensing.

Skills relacionados