¿Qué hace Editor de Video?
Resumen
Flujo de trabajo de video asistido por IA impulsado por tres motores:
- ffmpeg -- edita metraje existente (recortar, comprimir, fusionar, redimensionar, velocidad, estabilizar, marca de agua, audio, GIF, miniatura, transiciones, subtítulos)
- Remotion -- crea nuevo contenido de video (tarjetas de título, tercios inferiores, tarjetas finales, avances, superposiciones animadas)
- Whisper -- transcripción y generación de subtítulos
Capacidades adicionales:
- Aceleración de hardware en Apple Silicon mediante
h264_videotoolbox / hevc_videotoolbox
- Integración de temas con recursos de diseño desde
~/design-assets/color-palettes/
- Ajustes preestablecidos de plataforma para YouTube, Instagram, TikTok, Twitter y más
- Espacio de trabajo en caché para Remotion para evitar
npm install repetitivos
Cuándo Usar
Activar en CUALQUIERA de estas intenciones del usuario:
| Categoría | Palabras Clave |
|---|
| Edición básica | recortar, cortar, segmento, acortar, dividir |
| Compresión | comprimir, reducir tamaño, encoger, más pequeño, optimizar |
| Fusión | fusionar, combinar, concatenar, unir, coser |
| Redimensionado | redimensionar, escalar, recortar, rellenar, relación de aspecto, vertical, horizontal, cuadrado |
| Velocidad | acelerar, ralentizar, cámara lenta, time-lapse, avance rápido, invertir |
| Estabilización | estabilizar, movido, suavizar, arreglar vibración |
| Transiciones | fundido, encadenado, disolver, barrido, transición |
| Subtítulos | subtítulo, SRT, transcripción, voz a texto |
| Tarjetas de título | tarjeta de título, intro, apertura, texto animado |
| Tercios inferiores | tercio inferior, etiqueta de nombre, chyron, barra de nombre |
| Tarjetas finales | tarjeta final, outro, pantalla final, cierre |
| Avances | avance, tráiler, promoción, reel de destacados, montaje |
| Miniaturas | miniatura, póster, extraer fotograma, captura de pantalla |
| GIFs | GIF, imagen animada, bucle, meme |
| Marcas de agua | marca de agua, superposición de logo, branding |
| Audio | audio, volumen, normalizar, sonoridad, silenciar, fundido de entrada, fundido de salida, mezclar, extraer audio |
| Información | info, detalles, duración, resolución, códec, tasa de bits, metadatos |
| Canalización | canalización, lote, flujo de trabajo, multi-paso |
| Plataforma | YouTube, Instagram, TikTok, Twitter, Reels, Shorts |
Referencia de Comandos
Comandos de Edición (ffmpeg)
| Comando | Descripción | Ejemplo |
|---|
/trim | Cortar un segmento de un video | "recortar video.mp4 de 0:30 a 1:45" |
/compress | Reducir tamaño de archivo con control de calidad | "comprimir a menos de 10MB" |
/merge | Combinar varios clips en uno | "fusionar clip1.mp4 y clip2.mp4 con fundido" |
/resize | Cambiar dimensiones, relación de aspecto, recortar o rellenar | "redimensionar a 1080x1080 cuadrado" |
/speed | Acelerar, ralentizar o invertir | "2x velocidad" o "0.5x cámara lenta" |
/stabilize | Eliminar vibración de cámara (vidstab dos pasadas) | "estabilizar movido.mp4" |
/watermark | Superponer imagen o texto en video | "agregar logo.png abajo a la derecha" |
/audio | Volumen, normalizar, mezclar, fundido, extraer, silenciar | "normalizar audio a -14 LUFS" |
/thumbnail | Extraer fotograma como imagen | "miniatura en 0:15" |
/gif | Crear GIF animado desde un segmento de video | "GIF de 0:05 a 0:10 a 320px" |
/extract | Extraer pistas de audio o subtítulos | "extraer audio como mp3" |
/info | Mostrar metadatos de video y detalles de flujo | "información video.mp4" |
Comandos de Creación (Remotion)
| Comando | Descripción | Ejemplo |
|---|
/title-card | Tarjeta de título animada con soporte de temas | "tarjeta de título: Próximamente, tema wad, animación zoom" |
/lower-third | Superposición animada de nombre/título | "tercio inferior: Juan Pérez, CEO, estilo moderno" |
/end-card | Outro animado con CTA y redes sociales | "tarjeta final: ¡Suscríbete!, @usuario, tema ea" |
/teaser | Montaje de múltiples clips con transiciones y títulos | "avance desde la carpeta clips/, 30 segundos" |
Comandos de Transcripción (Whisper)
| Comando | Descripción | Ejemplo |
|---|
/transcribe | Generar SRT/VTT desde voz | "transcribir entrevista.mp4" |
/add-captions | Transcribir + grabar subtítulos en video | "agregar subtítulos a charla.mp4" |
Orquestación
| Comando | Descripción | Ejemplo |
|---|
/pipeline | Cadena de procesamiento multi-paso | "recortar, agregar tarjeta de título, comprimir para Instagram" |
Flujo de Trabajo
Paso 1: Verificar Herramientas Disponibles
which ffmpeg ffprobe && echo "ffmpeg: ok"
node --version && echo "node: ok"
which whisper && echo "whisper: ok" || echo "whisper: no instalado (los subtítulos necesitan .srt manual)"
ffmpeg -encoders 2>/dev/null | grep videotoolbox && echo "hw accel: ok" || echo "hw accel: no disponible"
ffmpeg -filters 2>/dev/null | grep vidstab && echo "vidstab: ok" || echo "vidstab: no disponible (brew install ffmpeg with --with-libvidstab)"
Si ffmpeg falta: "Instalar con brew install ffmpeg"
Si Node.js falta: "Instalar desde https://nodejs.org o brew install node"
Si vidstab falta: "Reinstalar ffmpeg con vidstab: brew install ffmpeg --with-libvidstab"
Paso 2: Clasificar Solicitud
| Intención del Usuario | Motor | Ruta |
|---|
| Editar metraje existente | ffmpeg | Paso 3a |
| Crear nuevo contenido de video | Remotion | Paso 3b |
| Manipulación de audio | Filtros de audio de ffmpeg | Paso 3a |
| Información/inspección | ffprobe | Paso 3a |
| Canalización combinada | orquestar ambos | Paso 3c |
| Publicación en plataforma | ajustes preestablecidos de redimensionar + comprimir | Paso 3a |
| Transcripción | Whisper + ffmpeg | Paso 3a |
Paso 3a: Ruta ffmpeg
- Preguntar por el archivo(s) de entrada si no se proporcionó
- Inspeccionar con ffprobe:
ffprobe -v quiet -print_format json -show_format -show_streams "<archivo>"
- Detección de aceleración de hardware (macOS Apple Silicon):
ffmpeg -encoders 2>/dev/null | grep h264_videotoolbox
- Manejo de colisiones de salida:
SALIDA="video_recortado.mp4"
CONTADOR=2
while [ -f "$SALIDA" ]; do
SALIDA="video_recortado_${CONTADOR}.mp4"
CONTADOR=$((CONTADOR + 1))
done
- Construir el comando ffmpeg
- Explicar cada flag en lenguaje sencillo
- Indicar el nombre del archivo de salida (nunca sobrescribir el origen)
- Preguntar: "¿Ejecuto esto?"
- Ejecutar, luego verificar:
if [ $? -eq 0 ]; then
echo "Éxito"
ffprobe -v quiet -print_format json -show_format "$SALIDA" | grep -E '"duration"|"size"'
else
echo "Error — revisar la salida de ffmpeg arriba"
fi
- Reportar ruta de salida + tamaño de archivo + duración
Convenciones de nomenclatura de salida:
| Comando | Patrón de Salida |
|---|
| Recortar | recortado_<nombrearchivo> |
| Comprimir | comprimido_<nombrearchivo> |
| Fusionar | salida_fusionada.<ext> |
| Redimensionar | redimensionado_<nombrearchivo> |
| Velocidad | velocidad_<factor>x_<nombrearchivo> |
| Estabilizar | estabilizado_<nombrearchivo> |
| Marca de agua | marcado_<nombrearchivo> |
| Subtítulos | subtitulado_<nombrearchivo> |
| Extraer audio | <nombre>.mp3 |
| Audio modificado | audio_<nombrearchivo> |
| Extraer subtítulos | <nombre>.srt |
| Miniatura | thumb_<nombre>_<códigohorario>.jpg |
| GIF | <nombre>.gif |
Paso 3b: Ruta Remotion
- Verificar que Node.js esté instalado
- Espacio de trabajo en caché -- reutilizar espacio de trabajo existente:
ESPACIO_TRABAJO="/tmp/espacio-trabajo-remotion"
if [ -d "$ESPACIO_TRABAJO/node_modules" ]; then
echo "Reutilizando espacio de trabajo de Remotion en caché"
else
echo "Creando espacio de trabajo de Remotion (primera ejecución)..."
mkdir -p "$ESPACIO_TRABAJO"
cp -r ~/plantillas-proyecto/remotion-video/* "$ESPACIO_TRABAJO/"
cd "$ESPACIO_TRABAJO" && npm install
fi
- Carga de temas desde
~/design-assets/color-palettes/:
- Escribir o actualizar los archivos de composición fuente según sea necesario
- Composiciones disponibles:
TitleCard -- título animado con múltiples ajustes preestablecidos de animación
LowerThird -- superposición de nombre/título con barra de acento
EndCard -- outro con CTA, redes sociales, logo
Teaser -- montaje de múltiples clips con TransitionSeries
- Renderizar:
cd "$ESPACIO_TRABAJO"
npx remotion render src/index.ts <IDComposición> /ruta/a/salida.mp4 \
--props='{"text":"Título","bg":"#09090B","fg":"#FFFFFF","accent":"#7C3AED"}'
- Copiar salida al directorio de trabajo del usuario
- Reportar ruta de salida + duración
Paso 3c: Canalización Combinada
Para solicitudes de múltiples pasos (ej., "hacer un avance con tarjeta de título, clips y tarjeta final"):
- Planificar -- describir cada paso al usuario antes de ejecutar
- Crear -- generar cualquier contenido de Remotion primero (tarjetas de título, tarjetas finales)
- Procesar -- recortar/redimensionar clips fuente con ffmpeg
- Ensamblar -- fusionar todas las piezas con transiciones usando ffmpeg
- Finalizar -- comprimir para la plataforma objetivo si se especifica
- Confirmar entre fases principales (creación vs. edición vs. ensamblaje)
Referencia Rápida de ffmpeg
Recortar (sin pérdida)
ffmpeg -ss <inicio> -to <final> -i entrada.mp4 -c copy entrada_recortada.mp4
Comprimir -- web (CRF 23)
ffmpeg -i entrada.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k entrada_comprimida.mp4
Comprimir -- acelerado por hardware (macOS)
ffmpeg -i entrada.mp4 -c:v h264_videotoolbox -b:v 5M -c:a aac -b:a 128k entrada_comprimida.mp4
Fusionar con transición de fundido
ffmpeg -i clip1.mp4 -i clip2.mp4 \
-filter_complex "[0][1]xfade=transition=fade:duration=1:offset=<desplazamiento>,format=yuv420p[v];[0:a][1:a]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" salida_fusionada.mp4
Redimensionar / Escalar
ffmpeg -i entrada.mp4 -vf "scale=1920:1080" entrada_redimensionada.mp4
ffmpeg -i entrada.mp4 -vf "scale=1080:-1" entrada_redimensionada.mp4
ffmpeg -i entrada.mp4 -vf "crop=min(iw\,ih):min(iw\,ih)" entrada_recortada.mp4
ffmpeg -i entrada.mp4 -vf "scale=1080:1080:force_original_aspect_ratio=decrease,pad=1080:1080:(ow-iw)/2:(oh-ih)/2:black" entrada_rellenada.mp4
Cambio de Velocidad
ffmpeg -i entrada.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" velocidad_2x_entrada.mp4
ffmpeg -i entrada.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" velocidad_0.5x_entrada.mp4
ffmpeg -i entrada.mp4 -vf "setpts=0.25*PTS" -af "atempo=2.0,atempo=2.0" velocidad_4x_entrada.mp4
ffmpeg -i entrada.mp4 -vf "reverse" -af "areverse" entrada_invertida.mp4
Superposición de Marca de Agua
ffmpeg -i entrada.mp4 -i logo.png \
-filter_complex "overlay=W-w-20:H-h-20" entrada_marcada.mp4
ffmpeg -i entrada.mp4 -i logo.png \
-filter_complex "overlay=20:20" entrada_marcada.mp4
ffmpeg -i entrada.mp4 -i logo.png \
-filter_complex "[1]format=rgba,colorchannelmixer=aa=0.3[wm];[0][wm]overlay=(W-w)/2:(H-h)/2" entrada_marcada.mp4
ffmpeg -i entrada.mp4 \
-vf "drawtext=text='Mi Marca':fontsize=24:[email protected]:x=W-tw-20:y=H-th-20" entrada_marcada.mp4
Estabilización de Video (vidstab dos pasadas)
ffmpeg -i movido.mp4 -vf vidstabdetect=shakiness=10:accuracy=15 -f null -
ffmpeg -i movido.mp4 -vf vidstabtransform=smoothing=30:input=transforms.trf estabilizado_movido.mp4
Manipulación de Audio
ffmpeg -i entrada.mp4 -af "volume=1.5" audio_entrada.mp4
ffmpeg -i entrada.mp4 -af "loudnorm=I=-14:TP=-1:LRA=11" audio_entrada.mp4
ffmpeg -i video.mp4 -i musica.mp3 \
-filter_complex "[0:a]volume=1.0[a1];[1:a]volume=0.3[a2];[a1][a2]amix=inputs=2:duration=first[a]" \
-map 0:v -map "[a]" audio_entrada.mp4
ffmpeg -i entrada.mp4 -af "afade=t=in:ss=0:d=3,afade=t=out:st=<final-3>:d=3" audio_entrada.mp4
ffmpeg -i entrada.mp4 -an entrada_silenciada.mp4
ffmpeg -i entrada.mp4 -i nueva_pista.mp3 -c:v copy -map 0:v:0 -map 1:a:0 entrada_audio_reemplazado.mp4
Creación de GIF (dos pasadas de paleta para calidad)
ffmpeg -ss <inicio> -t <duración> -i entrada.mp4 \
-vf "fps=15,scale=320:-1:flags=lanczos,palettegen" paleta.png
ffmpeg -ss <inicio> -t <duración> -i entrada.mp4 -i paleta.png \
-filter_complex "[0:v]fps=15,scale=320:-1:flags=lanczos[v];[v][1:v]paletteuse" salida.gif
rm paleta.png
Extracción de Miniatura
ffmpeg -ss <marca_tiempo> -i entrada.mp4 -frames:v 1 -q:v 2 thumb_entrada_<marca_tiempo>.jpg
ffmpeg -i entrada.mp4 -vf "fps=1/<intervalo>,scale=320:-1,tile=4x4" cuadricula_thumb_entrada.jpg
Grabar subtítulos .srt
ffmpeg -i entrada.mp4 -vf "subtitles=subtitulos.srt:force_style='FontSize=24,PrimaryColour=&H00FFFFFF'" entrada_subtitulada.mp4
Extraer audio
ffmpeg -i entrada.mp4 -vn -c:a libmp3lame -q:a 2 salida.mp3
Información de video
ffprobe -v quiet -print_format json -show_format -show_streams entrada.mp4
Referencia Rápida de Remotion
Configuración de Espacio de Trabajo en Caché
ESPACIO_TRABAJO="/tmp/espacio-trabajo-remotion"
if [ ! -d "$ESPACIO_TRABAJO/node_modules" ]; then
cp -r ~/plantillas-proyecto/remotion-video/* "$ESPACIO_TRABAJO/"
cd "$ESPACIO_TRABAJO" && npm install
fi
Composición de TitleCard
import { AbsoluteFill, spring, useCurrentFrame, useVideoConfig, Img } from 'remotion';
type Animation = 'fade' | 'slide-up' | 'slide-down' | 'zoom' | 'typewriter' | 'glitch' | 'blur-in';
export const TitleCard: React.FC<{
text: string;
subtitle?: string;
bg?: string;
fg?: string;
accent?: string;
animation?: Animation;
logo?: string;
}> = ({ text, subtitle, bg = '#09090B', fg = '#FFFFFF', accent = '#7C3AED', animation = 'fade', logo }) => {
const frame = useCurrent
…
[truncado para traducción]