← All posts

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.

FFHub·2026-04-28
Cómo agregar subtítulos a un video con FFmpeg (guía completa paso a paso)

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étodoDescripciónVentajasDesventajas
Hardcode (quemado)Subtítulos renderizados en los píxeles del videoSiempre visible, reproducción universalNo se pueden desactivar, requiere re-codificación
Softcode (incrustado)Subtítulos almacenados como pista separadaActivables/desactivables, múltiples idiomasEl 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ámetroEjemploDescripción
FontNameArialTipo de fuente
FontSize24Tamaño en puntos
PrimaryColour&H00FFFFFFColor del texto (hex ABGR)
OutlineColour&H00000000Color del contorno
BackColour&H80000000Color de sombra/fondo
Outline2Grosor del contorno
Shadow1Profundidad de la sombra
Bold1Texto en negrita (0 o 1)
Alignment2Posición (2=centro inferior)
MarginV30Margen 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
DesdeHacia¿Preserva estilos?
SRT → ASSAgrega estilos predeterminados
ASS → SRTNoPierde todos los estilos
SRT → VTTParcialmenteFormato básico conservado
VTT → SRTParcialmentePierde 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_text para MP4, -c:s srt para MKV) para pistas activables/desactivables
  • Usa force_style para personalizar la apariencia de los subtítulos SRT
  • Usa el formato ASS cuando necesites estilos enriquecidos y animaciones
  • Usa -map para agregar múltiples idiomas de subtítulos
  • Usa ffprobe para 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 agregar subtítulos a un video con FFmpeg (guía completa paso a paso) | FFHub