Cómo agregar subtítulos a un video con FFmpeg (guía completa paso a paso)
Guía completa para agregar subtítulos con FFmpeg — incrustación hardcode de SRT/ASS, pistas softcode, personalización de estilos, soporte multilenguaje y extracción de subtítulos.

Los subtítulos hacen que los videos sean accesibles, buscables y aptos para ver en entornos ruidosos. FFmpeg puede incrustar subtítulos directamente en el video (hardcode), incorporarlos como pistas seleccionables, extraer subtítulos existentes y convertir entre formatos de subtítulos. Esta guía lo cubre todo con comandos prácticos.
Hardcode vs softcode: ¿cuál elegir?
Antes de agregar subtítulos, necesitas decidir cómo hacerlo:
| Método | Descripción | Ventajas | Desventajas |
|---|---|---|---|
| Hardcode (quemado) | Subtítulos renderizados en los píxeles del video | Siempre visible, reproducción universal | No se pueden desactivar, requiere re-codificación |
| Softcode (incrustado) | Subtítulos almacenados como pista separada | Activables/desactivables, múltiples idiomas | El reproductor debe soportarlo |
Regla general: Hardcode para redes sociales y máxima compatibilidad. Softcode para contenido largo y soporte multilenguaje. Si estás construyendo una plataforma UGC que procesa videos subidos por usuarios, el softcode suele ser la mejor opción.
Hardcode de subtítulos SRT
SRT es el formato de subtítulos más común. Para quemarlos en el video:
# Hardcode de subtítulos SRT
ffmpeg -i input.mp4 -vf "subtitles=subs.srt" output.mp4
Eso es todo. FFmpeg usa el filtro subtitles (impulsado por libass) para renderizar el archivo SRT directamente sobre cada fotograma.
Personalizar la apariencia del SRT
El renderizado SRT predeterminado es básico. Puedes darle estilo con la opción force_style:
# Fuente, tamaño y color personalizados
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontName=Arial,FontSize=24,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2,Shadow=1'" output.mp4
Parámetros de estilo comunes:
| Parámetro | Ejemplo | Descripción |
|---|---|---|
| FontName | Arial | Tipo de fuente |
| FontSize | 24 | Tamaño en puntos |
| PrimaryColour | &H00FFFFFF | Color del texto (hex ABGR) |
| OutlineColour | &H00000000 | Color del contorno |
| BackColour | &H80000000 | Color de sombra/fondo |
| Outline | 2 | Grosor del contorno |
| Shadow | 1 | Profundidad de la sombra |
| Bold | 1 | Texto en negrita (0 o 1) |
| Alignment | 2 | Posición (2=centro inferior) |
| MarginV | 30 | Margen vertical desde el borde |
Nota: Los colores usan el formato ABGR (Alpha, Blue, Green, Red), no el RGB habitual.
# Texto amarillo con contorno negro, fuente más grande, posicionado más arriba
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontSize=28,PrimaryColour=&H0000FFFF,OutlineColour=&H00000000,Outline=3,MarginV=40'" output.mp4
Manejar caracteres especiales en rutas de archivo
Si la ruta del archivo de subtítulos contiene caracteres especiales, escápalos:
# Escapar dos puntos en rutas de Windows o caracteres especiales
ffmpeg -i input.mp4 -vf "subtitles='my\ subtitles.srt'" output.mp4
# O usar el enfoque de índice de archivo de subtítulos
ffmpeg -i input.mp4 -i subs.srt -filter_complex "[0:v][1:s]overlay" output.mp4
Hardcode de subtítulos ASS/SSA con estilos
Los subtítulos ASS (Advanced SubStation Alpha) soportan estilos enriquecidos — fuentes, colores, animaciones y posicionamiento por línea. Al hacer hardcode de archivos ASS, todos los estilos se preservan:
# Hardcode de subtítulos ASS (todos los estilos preservados)
ffmpeg -i input.mp4 -vf "ass=subs.ass" output.mp4
Crear un archivo ASS simple
Aquí hay un ejemplo de la estructura de un archivo ASS:
[Script Info]
Title: My Subtitles
ScriptType: v4.00+
PlayResX: 1920
PlayResY: 1080
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,48,&H00FFFFFF,&H000000FF,&H00000000,&H80000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,40,1
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello, this is a subtitle.
Dialogue: 0,0:00:05.00,0:00:08.00,Default,,0,0,0,,This line has {\b1}bold{\b0} text.
Convertir SRT a ASS con estilos personalizados
# Convertir SRT a ASS (luego puedes editar los estilos ASS)
ffmpeg -i subs.srt subs.ass
Después de convertir, edita la sección [V4+ Styles] en el archivo ASS para personalizar la apariencia. También puedes convertir tu video a un formato diferente antes de agregar subtítulos, según tu plataforma de destino.
Softcode de subtítulos (pistas incrustadas)
Los subtítulos softcode se almacenan como un stream separado dentro del contenedor. El espectador puede activarlos o desactivarlos.
Agregar SRT como pista de subtítulos
# Agregar pista de subtítulos SRT a MP4
ffmpeg -i input.mp4 -i subs.srt -c copy -c:s mov_text output.mp4
# Agregar pista de subtítulos SRT a MKV (MKV soporta SRT de forma nativa)
ffmpeg -i input.mp4 -i subs.srt -c copy -c:s srt output.mkv
Importante: los contenedores MP4 requieren el códec mov_text para subtítulos. MKV soporta SRT, ASS y muchos otros formatos de forma nativa.
Agregar múltiples idiomas de subtítulos
# Agregar pistas de subtítulos en inglés y español a MKV
ffmpeg -i input.mp4 -i english.srt -i spanish.srt \
-map 0:v -map 0:a -map 1 -map 2 \
-c copy -c:s srt \
-metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:s:1 language=spa -metadata:s:s:1 title="Spanish" \
output.mkv
Para MP4:
# Agregar múltiples pistas de subtítulos a MP4
ffmpeg -i input.mp4 -i english.srt -i chinese.srt \
-map 0:v -map 0:a -map 1 -map 2 \
-c copy -c:s mov_text \
-metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:s:1 language=chi -metadata:s:s:1 title="Chinese" \
output.mp4
Establecer la pista de subtítulos predeterminada
# Marcar la primera pista de subtítulos como predeterminada
ffmpeg -i input.mp4 -i subs.srt \
-map 0 -map 1 \
-c copy -c:s mov_text \
-disposition:s:0 default \
output.mp4
Agregar subtítulos ASS como pista soft
# Agregar ASS a MKV (preserva todos los estilos para reproductores compatibles)
ffmpeg -i input.mp4 -i subs.ass -map 0 -map 1 -c copy -c:s ass output.mkv
Extraer subtítulos de un video
Extraer a SRT
# Extraer la primera pista de subtítulos a SRT
ffmpeg -i input.mkv -map 0:s:0 output.srt
# Extraer la segunda pista de subtítulos
ffmpeg -i input.mkv -map 0:s:1 output.srt
Extraer a ASS
# Extraer pista de subtítulos como ASS (preserva los estilos)
ffmpeg -i input.mkv -map 0:s:0 output.ass
Listar las pistas de subtítulos disponibles
# Mostrar todos los streams incluidos los subtítulos
ffprobe -v error -show_entries stream=index,codec_name,codec_type -of csv input.mkv
# Información más detallada sobre los subtítulos
ffprobe -v error -select_streams s -show_entries stream=index,codec_name:stream_tags=language,title -of json input.mkv
Extraer todas las pistas de subtítulos
#!/bin/bash
# Extraer todas las pistas de subtítulos de un video
INPUT="input.mkv"
# Contar los streams de subtítulos
COUNT=$(ffprobe -v error -select_streams s -show_entries stream=index -of csv=p=0 "$INPUT" | wc -l)
for i in $(seq 0 $((COUNT - 1))); do
# Obtener etiqueta de idioma
LANG=$(ffprobe -v error -select_streams s:$i -show_entries stream_tags=language -of csv=p=0 "$INPUT")
LANG=${LANG:-"track$i"}
ffmpeg -i "$INPUT" -map 0:s:$i "${INPUT%.*}_${LANG}.srt"
done
Convertir entre formatos de subtítulos
FFmpeg puede convertir entre formatos de subtítulos:
# SRT a ASS
ffmpeg -i subs.srt subs.ass
# ASS a SRT (pierde los estilos)
ffmpeg -i subs.ass subs.srt
# SRT a WebVTT
ffmpeg -i subs.srt subs.vtt
# SUB/IDX (DVD) a SRT (requiere OCR — FFmpeg no puede hacerlo directamente)
# Usa una herramienta como SubtitleEdit o Tesseract para conversión de mapa de bits a texto
| Desde | Hacia | ¿Preserva estilos? |
|---|---|---|
| SRT → ASS | Sí | Agrega estilos predeterminados |
| ASS → SRT | No | Pierde todos los estilos |
| SRT → VTT | Parcialmente | Formato básico conservado |
| VTT → SRT | Parcialmente | Pierde características específicas de VTT |
Ajustes de sincronización de subtítulos
Retrasar o adelantar subtítulos
# Retrasar subtítulos 2.5 segundos
ffmpeg -i input.mp4 -itsoffset 2.5 -i subs.srt -map 0 -map 1 -c copy -c:s mov_text output.mp4
Para subtítulos hardcode, usa el filtro setpts o ajusta el archivo SRT directamente (si necesitas recortar o combinar segmentos de video, los ajustes de sincronización se vuelven especialmente importantes):
# Desplazar subtítulos hardcode (usando filtro de subtítulos con offset)
ffmpeg -i input.mp4 -vf "subtitles=subs.srt" -ss 00:00:02.500 output.mp4
Hardcode de subtítulos con control de resolución
Al hacer hardcode, la calidad del renderizado de subtítulos depende de la resolución del video. Para mejores resultados, mantén la resolución original:
# Hardcode de subtítulos manteniendo la resolución original
ffmpeg -i input.mp4 -vf "subtitles=subs.srt" -c:v libx264 -crf 23 -c:a copy output.mp4
# Hardcode y escalar a 1080p
ffmpeg -i input.mp4 -vf "subtitles=subs.srt,scale=-2:1080" -c:v libx264 -crf 23 -c:a copy output.mp4
Renderizado de fuentes de subtítulos para distintas resoluciones
# Para video de 720p — fuente más pequeña
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontSize=20'" -c:v libx264 -crf 23 output.mp4
# Para video 4K — fuente más grande
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontSize=48,Outline=3'" -c:v libx264 -crf 23 output.mp4
Operaciones de subtítulos en lotes
Hardcode de subtítulos para todos los videos
# Asume que cada video tiene un archivo .srt con el mismo nombre
for f in *.mp4; do
srt="${f%.mp4}.srt"
if [ -f "$srt" ]; then
ffmpeg -i "$f" -vf "subtitles=$srt" -c:v libx264 -crf 23 -c:a copy "subtitled_${f}"
fi
done
Softcode de subtítulos para todos los videos
# Agregar archivos SRT coincidentes como pistas de subtítulos
for f in *.mp4; do
srt="${f%.mp4}.srt"
if [ -f "$srt" ]; then
ffmpeg -i "$f" -i "$srt" -c copy -c:s mov_text "soft_${f}"
fi
done
Solución de problemas
"No such filter: subtitles" — FFmpeg fue compilado sin soporte de libass. Instala una compilación completa:
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt install ffmpeg libass-dev
Los subtítulos no aparecen — Verifica la codificación del archivo de subtítulos. FFmpeg espera UTF-8:
# Convertir codificación de subtítulos a UTF-8
iconv -f ISO-8859-1 -t UTF-8 subs_latin.srt > subs_utf8.srt
Posición o tamaño de subtítulos incorrecto — La resolución del video no coincide con la resolución asumida por los subtítulos. Usa force_style para sobrescribir:
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontSize=24,MarginV=30'" output.mp4
Los caracteres especiales se muestran como cuadros — La fuente no soporta esos caracteres. Especifica una fuente que soporte tu idioma:
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontName=Noto Sans CJK SC'" output.mp4
La salida MP4 falla con "unknown codec" para subtítulos — MP4 solo soporta mov_text. Usa MKV para otros formatos de subtítulos, o haz hardcode en su lugar.
Alternativa en la nube con FFHub
El hardcode de subtítulos requiere re-codificación, lo cual consume mucha CPU — un video de 1 hora puede tardar 20 o más minutos en una máquina estándar. FFHub ejecuta FFmpeg en la nube via API, por lo que puedes delegar el quemado de subtítulos a servidores en la nube rápidos mientras tu máquina queda libre.
Esto es especialmente útil cuando necesitas generar múltiples versiones de subtítulos (distintos idiomas, distintos estilos) desde el mismo video fuente.
Resumen
- Hardcode (
-vf "subtitles=subs.srt") para visibilidad garantizada en todas las plataformas - Softcode (
-c:s mov_textpara MP4,-c:s srtpara MKV) para pistas activables/desactivables - Usa
force_stylepara personalizar la apariencia de los subtítulos SRT - Usa el formato ASS cuando necesites estilos enriquecidos y animaciones
- Usa
-mappara agregar múltiples idiomas de subtítulos - Usa
ffprobepara inspeccionar las pistas de subtítulos existentes antes de extraerlas - Asegúrate siempre de que los archivos de subtítulos estén codificados en UTF-8
Artículos relacionados
- Cómo recortar y combinar videos con FFmpeg - Cortar, dividir y concatenar clips de video manteniendo la sincronización de los subtítulos
- Cómo convertir formatos de video con FFmpeg - Cambiar entre contenedores MP4, MKV y WebM que manejan los subtítulos de forma distinta
- Cómo extraer audio de un video con FFmpeg - Extraer pistas de audio de un video para transcripción y generación de subtítulos