Un archivo VTT (WebVTT, de Web Video Text Tracks) es un archivo de texto plano con los subtítulos de un vídeo para la web. Empieza con la línea WEBVTT, seguida de bloques que unen un código de tiempo como 00:00:03.400 --> 00:00:06.800 con el texto que aparece en ese momento, y tiene que estar guardado en UTF-8. Lo abres con cualquier editor de texto y lo ves con VLC o en el navegador. Hemos escrito un archivo de ejemplo en español y hemos cargado archivos estropeados a propósito en Chrome para ver qué hace desaparecer los subtítulos.

¿Qué es un archivo VTT?

VTT es la abreviatura de Web Video Text Tracks, «pistas de texto para vídeo en la web». El formato lo define el W3C, el organismo que publica los estándares de la web. En octubre de 2026, su especificación sigue siendo un «Candidate Recommendation Draft» (versión del 20 de mayo de 2026), un borrador que aún no es una recomendación definitiva. Los navegadores lo usan desde hace años: según MDN, el elemento HTML <track>, que carga archivos WebVTT en un reproductor de vídeo, funciona en todos los navegadores desde julio de 2015.

Lo esencial en tres puntos:

  • Texto plano. La extensión es .vtt, el tipo MIME es text/vtt y el texto tiene que estar codificado en UTF-8.
  • Un heredero del SRT. WebVTT nació en 2010 con el nombre de WebSRT, a partir del formato SRT del programa SubRip, y se definió primero dentro del estándar HTML antes de tener su propia especificación. El formato original lo explicamos en nuestra guía del archivo SRT.
  • Un formato, varios usos. El mismo tipo de archivo sirve para subtítulos de traducción, subtítulos para personas sordas, títulos de capítulos y metadatos para scripts. Su función la decide la página web o la plataforma, no el archivo.

Qué hay dentro de un archivo VTT: nuestro ejemplo, línea a línea

Hemos escrito un archivo corto con todas las piezas habituales y con lo que más se rompe en español: tildes, eñes, signos de apertura y comillas angulares.

Archivo WebVTT con la cabecera WEBVTT, un comentario NOTE, un bloque STYLE y cuatro subtítulos en español con sus códigos de tiempo, ajustes como line:0 y etiquetas como i y v Lucía
Nuestro archivo de ejemplo ejemplo-subtitulos-es.vtt, guardado en UTF-8. Polytested, 17 de octubre de 2026.
  • Cabecera: la primera línea es WEBVTT. Después de un espacio o un tabulador puedes añadir un título, como WEBVTT - Ejemplo de Polytested (español). Delante se permite una marca de orden de bytes (BOM) invisible. Los saltos de línea pueden ser de Windows (CRLF) o de Unix (LF).
  • Comentario: un bloque que empieza por NOTE nunca se muestra. Termina en la primera línea en blanco.
  • Bloque de estilo: STYLE contiene CSS para los subtítulos. Tiene que ir antes del primer subtítulo y no puede tener líneas en blanco. El nuestro colorea todo lo que dice Lucía.
  • Identificador: una línea opcional antes del código de tiempo, un número o una palabra como cocina. Según la especificación, cada identificador debe ser único en el archivo.
  • Código de tiempo: horas, minutos, segundos, un punto y exactamente tres cifras de milisegundos. Las horas se pueden omitir (00:03.400) mientras valgan cero. La flecha son dos guiones y el signo «mayor que», con un espacio a cada lado. Los subtítulos van en el orden de su inicio.
  • Ajustes (cue settings): van detrás del código de tiempo. line:0 coloca el subtítulo arriba de la imagen, align:start lo alinea a la izquierda y position:10% lo desplaza hacia la derecha. La especificación define seis: vertical, line, position, size, align y region.
  • Texto y etiquetas: <i>, <b> y <u> para cursiva, negrita y subrayado, <v Lucía> para quien habla, <lang en> para un fragmento en otro idioma y <c.nombre> para una clase CSS. Una línea en blanco cierra el subtítulo, así que su texto no puede contener ninguna.
  • Caracteres reservados: escribe & como &amp; y < como &lt;. El texto de un subtítulo tampoco puede contener la flecha -->.

Un archivo mínimo con un solo subtítulo cabe en cuatro líneas:

minimo.vtt
WEBVTT

00:00.000 --> 00:02.500
Aquí empiezan los subtítulos.

El estilo tiene límites. Con el selector ::cue solo funciona una lista corta de propiedades CSS, entre ellas el color, el fondo, la fuente, la sombra del texto, el contorno y la opacidad. La posición no se fija con CSS, sino con los ajustes.

VTT o SRT: las diferencias

Este es el subtítulo 2 de nuestro ejemplo en los dos formatos:

ejemplo-subtitulos-es.srt
2
00:00:03,400 --> 00:00:06,800
la misma tarea en español, inglés,
alemán y francés.
ejemplo-subtitulos-es.vtt
WEBVTT

2
00:00:03.400 --> 00:00:06.800
la misma tarea en español, inglés,
alemán y francés.
SRT y WebVTT comparados, según la especificación del W3C y la ayuda de las plataformas, octubre de 2026
AspectoSRTWebVTT
Primera líneael número del primer subtítuloWEBVTT
Antes de los milisegundoscomapunto
Horassiempre escritasopcionales
Númerosobligatoriosopcionales, cualquier identificador único
Codificaciónno definida; YouTube y Vimeo piden UTF-8UTF-8, siempre
Posición y estiloetiquetas sencillas, según el reproductorajustes, bloques STYLE, clases
Comentariosno tienebloques NOTE
Elemento <track> de los navegadoresChrome lo rechazó en nuestra pruebasí
LinkedInlo aceptano lo acepta
YouTubelo acepta, sin etiquetas de estilolo acepta, con posición

Usa SRT donde una plataforma lo pida y en reproductores antiguos. Usa WebVTT para un vídeo en tu propia web, para Vimeo y siempre que importen la posición, los colores o el nombre de quien habla. Si además quieres traducir los subtítulos sin romper el archivo, mira nuestra guía para traducir subtítulos.

Cómo muestra el navegador un archivo VTT

El navegador solo usa un archivo VTT a través de una página web: el elemento <track>, dentro de un <video>, apunta a él.

subtitulos.html
<video controls src="demo.mp4">
  <track kind="subtitles" src="ejemplo-subtitulos-es.vtt" srclang="es" label="Español" default>
  <track kind="captions" src="sordos-es.vtt" srclang="es" label="ES (sordos)">
</video>
  • kind: subtitles (el valor predeterminado), captions para subtítulos con sonidos y música, descriptions, chapters o metadata. Un valor no válido se trata como metadata, una pista para scripts que el público no ve.
  • srclang: el idioma de la pista; obligatorio si kind es subtitles.
  • label: el nombre que aparece en la lista de pistas.
  • default: la pista activada de entrada; solo una por vídeo.

Lo que vimos en nuestras propias pruebas:

  • Chrome respeta el archivo. El 14 de octubre de 2026, Chrome 155 mostró nuestro archivo de prueba (en alemán) tal como estaba escrito: un subtítulo arriba, otro en dos líneas abajo, otro alineado a la izquierda y en cursiva, y la frase de quien habla con el color del bloque STYLE. El nombre de la etiqueta <v …> no aparecía: solo identifica el texto para darle estilo.
  • Las clases de color necesitan un bloque STYLE. La especificación prevé clases como <c.red> o <c.yellow>. Solas, se quedaron en blanco en Chrome 155 el 14 de octubre de 2026. El 15 de octubre, Chrome 155 y Edge 155 solo colorearon el amarillo y el cian cuando un bloque STYLE definía esos colores.
  • El menú solo muestra el nombre. En los reproductores integrados de Chrome 155 y Edge 155 (interfaz en alemán, 15 de octubre de 2026), el menú de subtítulos listaba cada pista por su label. Una pista sin label aparecía con su código de idioma. Si era captions o subtitles solo se notaba por un pequeño icono, y solo cuando dos pistas tenían el mismo nombre o una no tenía ninguno. Chrome ya cortaba nombres de diez caracteres; «DE (UT)», de siete, cabía entero. Pon primero lo que distingue la pista y usa nombres cortos.
  • El efecto karaoke no se ve. WebVTT puede marcar el tiempo de cada palabra dentro de un subtítulo. El 15 de octubre de 2026, Chrome 155 y Edge 155 leían esas marcas, pero no colorearon de forma distinta las palabras ya cantadas y las siguientes.
  • Otro dominio exige CORS. Un archivo VTT alojado en un dominio distinto al de la página solo se cargó cuando el elemento <video> tenía el atributo crossorigin y el servidor permitía la petición.

Qué hace desaparecer los subtítulos: nuestra prueba en Chrome

Cargamos el mismo archivo de prueba, tres subtítulos en alemán, como pista en Chrome 155, cambiando cada vez una sola cosa, y anotamos lo que Chrome comunicaba.

Nuestro archivo de prueba, cambiado en un solo punto por variante y cargado como pista en Chrome 155, 14 de octubre de 2026
VarianteResultado
Válido: UTF-8, cabecera, puntos3 de 3 subtítulos
UTF-8 con BOM3 de 3
Cabecera con un título tras un espacio3 de 3
Sin horas, como 00:01.0003 de 3
Guardado en Windows-12523 de 3, pero � en lugar de ä, ö, ü, ß y €
Windows-1252, el servidor indica charset=windows-1252el mismo �
Sin la línea WEBVTTerror, ningún subtítulo
webvtt en minúsculaserror, ningún subtítulo
WEBVTT seguido directamente de un guionerror, ningún subtítulo
Comas en todos los códigos de tiempocarga sin error, pero 0 subtítulos
Una coma en un solo código de tiempo2 de 3, sin mensaje de error
Dos cifras de milisegundos2 de 3, sin mensaje de error
Semirraya en la flecha: –>2 de 3, sin mensaje de error
Un archivo SRT como pistaerror, ningún subtítulo
  • Las comas fallan en silencio. Con las comas del SRT, el archivo se cargó «sin problemas» y no mostró nada.
  • La cabecera no perdona. Exactamente WEBVTT, en mayúsculas, seguida de un espacio, un tabulador o un salto de línea.
  • Un guion basta para romperlo. Algunas webs convierten los dos guiones de la flecha en una raya: escribe la flecha tú mismo en lugar de copiar un ejemplo.
  • Cambiar la extensión no es convertir. Chrome rechazó un archivo SRT renombrado a .vtt.
  • Un < suelto corta el texto. En la misma serie, de la línea «Wenn 3 < 5 gilt, passt es» («si 3 < 5, encaja») Chrome solo conservó «Wenn 3». Un & suelto pasó sin problema, pero escapa los dos.

Codificación: un archivo VTT siempre es UTF-8

En un archivo SRT la codificación no está definida y los reproductores la adivinan. En WebVTT no hay nada que adivinar: la especificación exige UTF-8 y obliga a todo lector a decodificar el archivo como UTF-8. En nuestra prueba, un archivo guardado en Windows-1252 (lo que Windows suele llamar «ANSI») mostró el carácter de sustitución � en cada letra especial, incluso cuando el servidor indicaba que el archivo estaba en Windows-1252.

Estos son dos subtítulos de nuestro ejemplo en español, guardados en Windows-1252 y decodificados después como UTF-8, tal como pide la especificación:

ejemplo-subtitulos-es.vtt, guardado en Windows-1252, leído como UTF-8
�Hola a todos! Hoy probamos

<v Luc�a>��Ya est�? �Qu� r�pido, se�or N��ez!�

La última línea tiene once caracteres de sustitución: comillas angulares, signos de apertura, tildes, eñes y hasta el nombre de la etiqueta. Guarda cada archivo VTT en UTF-8; el BOM es opcional y no causó ningún problema en nuestra prueba. En Notepad++, el menú Codificación ofrece «Convertir a UTF-8». Cómo hacerlo en el Bloc de notas y en TextEdit lo explicamos en la guía del archivo SRT.

Cómo abrir un archivo VTT

  • Para leerlo o editarlo: con cualquier editor de texto plano, como el Bloc de notas en Windows o TextEdit en Mac en modo texto. Evita los procesadores de texto, que añaden formato.
  • Para verlo con el vídeo: VLC lee WebVTT desde la versión 2.2 y reescribió ese soporte en la 3.0, estilos CSS incluidos. Dale al archivo .vtt el mismo nombre que al vídeo y guárdalo en la misma carpeta: VLC lo carga solo. Si no, usa Subtítulo > Añadir archivo de subtítulos...
  • Para editarlo con vista previa: Subtitle Edit, gratuito y de código abierto, para Windows, macOS y Linux, muestra los subtítulos sobre el vídeo y los guarda en otros formatos. Su interfaz está disponible en español.
  • En el navegador: a través de una página web con un elemento <track>, como el de arriba.

Cómo convertir un archivo VTT a SRT

Lo más sencillo es Subtitle Edit: abre el archivo .vtt y elige Archivo > Guardar como... con el formato SubRip (.srt). El SRT no tiene sitio para bloques STYLE, comentarios ni ajustes de posición, así que se pierden.

Sin programas, usa buscar y reemplazar con expresiones regulares, en Visual Studio Code (Ctrl+H y el botón .*) o en Notepad++ (Buscar > Sustituir..., modo «Expresión regular», con «. para nueva línea» desmarcado, y «Sustituir todo»). Probamos estas expresiones con el motor de expresiones regulares de JavaScript, el que usa la búsqueda de VS Code, en archivos con saltos de línea de Windows y de Unix. Sigue este orden:

  1. Borra la línea WEBVTT y todos los bloques NOTE y STYLE.
  2. Añade las horas que falten: busca (?<![\d:])(\d\d:\d\d\.\d\d\d) y reemplaza por 00:$1.
  3. Cambia el punto por una coma solo en los códigos de tiempo: busca (\d\d:\d\d:\d\d)\.(\d\d\d) y reemplaza por $1,$2.
  4. Quita los ajustes: busca ^(\d\d:\d\d:\d\d,\d\d\d --> \d\d:\d\d:\d\d,\d\d\d)[ \t].*$ y reemplaza por $1.
  5. Quita los identificadores: busca ^.+\r?\n(?=\d\d:\d\d:\d\d,\d\d\d --> ) y reemplaza por nada. Después numera los subtítulos 1, 2, 3; en archivos largos, deja que lo haga Subtitle Edit.
  6. Convierte las etiquetas de voz en nombres: busca <v(?:\.[^ \t>]+)*[ \t]+([^>]+)> y reemplaza por $1: `. Luego borra las demás etiquetas salvo i, b y u: busca `<(?!\/?[ibu]>)[^>]+> y reemplaza por nada.
  7. Cambia &lt; por <, &gt; por > y, al final, &amp; por &.
  8. Guarda en UTF-8 con la extensión .srt.

El paso 3 es donde fallan los atajos. Reemplazar todos los puntos del archivo estropea el texto, no solo los códigos de tiempo. Así queda nuestro breve fragmento de reunión tras un «Sustituir todo» a ciegas:

reunion-es.vtt, todos los puntos cambiados por comas
00:00:01,000 --> 00:00:04,200
<v Lucía Gómez>¡Buenos días! ¿El Sr, Peña aprobó la factura de 1,234,50 €?</v>

00:00:04,600 --> 00:00:07,900
<v Javier Ruiz>Sí, el 1,º de octubre, p, ej, con la de Madrid,</v>

Los códigos de tiempo ya sirven para SRT, pero «Sr.», el importe, el ordinal «1.º» y «p. ej.» se han estropeado. Da igual cómo escribas los importes: tanto 1.234,50 como 1,234.50 acaban como 1,234,50. Con los pasos de arriba, el mismo fragmento da un SRT limpio:

reunion-es.srt
1
00:00:01,000 --> 00:00:04,200
Lucía Gómez: ¡Buenos días! ¿El Sr. Peña aprobó la factura de 1.234,50 €?

2
00:00:04,600 --> 00:00:07,900
Javier Ruiz: Sí, el 1.º de octubre, p. ej. con la de Madrid.

Cómo convertir un archivo VTT a texto (Teams, Zoom)

En Microsoft Teams, los organizadores y coorganizadores pueden descargar de forma predeterminada la transcripción como archivo .docx o .vtt: en Chat, abre el chat de la reunión, selecciona Resumen, luego Transcripción y después la flecha desplegable junto a la descarga, y elige el tipo de archivo. Si solo te interesa el texto, descarga el .docx. En los archivos de Teams, quien habla va en una etiqueta de voz como <v User Name>, según la documentación para desarrolladores de Microsoft. Zoom guarda la transcripción de una grabación en la nube como archivo VTT, con una cuenta Pro, Business, Education o Enterprise.

Para quedarte solo con el texto:

  • Subtitle Edit: Archivo > Exportar > Texto plano...
  • Buscar y reemplazar: borra la cabecera y los bloques NOTE y STYLE; borra cada línea de tiempo con el identificador que tenga encima (^(?:.+\r?\n)?(?:\d+:)?\d\d:\d\d\.\d\d\d[ \t]+-->.*\r?\n); convierte las etiquetas de voz en nombres como en el paso 6 y luego borra todas las etiquetas (<[^>]+>); decodifica &lt;, &gt; y &amp;; une las líneas de cada subtítulo ((\S)\r?\n(?=\S) por $1 `); y, por último, quita las líneas en blanco ((\r?\n)(?:\r?\n)+ por `$1).

Nuestro fragmento de reunión, convertido así:

reunion-es.txt
Lucía Gómez: ¡Buenos días! ¿El Sr. Peña aprobó la factura de 1.234,50 €?
Javier Ruiz: Sí, el 1.º de octubre, p. ej. con la de Madrid.

Para convertir la transcripción en un acta, mira nuestra guía sobre el acta de reunión; si es una entrevista, la de transcribir una entrevista. Una transcripción de reunión contiene nombres y a menudo información confidencial, es decir, datos personales: conviértela en tu ordenador y no en un conversor en línea gratuito.

Dónde puedes usar archivos VTT

Compatibilidad con VTT según la ayuda de cada plataforma, revisada en octubre de 2026
Plataforma¿VTT?Qué saber
YouTubesíLa posición funciona; el estilo se limita a negrita, cursiva y subrayado. Para empezar, YouTube recomienda SRT o SBV.
Vimeosí, recomendadoEn UTF-8 y empezando por WEBVTT.
LinkedInnoSolo SRT, desde un navegador de ordenador.
Microsoft Stream (SharePoint, OneDrive)síPrimera línea WEBVTT; notas, comentarios y estilos se eliminan al cargar; 4 MB como máximo.
PowerPointsíWebVTT desde Office 2016, en Mac desde la versión 16.63; SRT en UTF-8 solo desde la versión 2411.
Microsoft TeamsdescargaTranscripciones en .docx o .vtt.
ZoomdescargaTranscripciones de grabaciones en la nube en VTT.
H5PsíLos subtítulos tienen que ser .vtt (ayuda en inglés).

En Microsoft Stream, el archivo se carga en Configuración de vídeo, sección Transcripciones y subtítulos, Cargar. En PowerPoint, selecciona el vídeo y, en la pestaña Reproducción, elige Insertar subtítulos > Insertar subtítulos. Descript exporta los subtítulos en SRT o VTT.

Lista de comprobación antes de subir el archivo

  1. UTF-8, con o sin BOM.
  2. Primera línea exactamente WEBVTT, como mucho con un título tras un espacio.
  3. Códigos de tiempo con punto y tres cifras de milisegundos, en orden cronológico.
  4. Flechas escritas con dos guiones y el signo «mayor que».
  5. Bloques STYLE antes del primer subtítulo, sin líneas en blanco.
  6. &amp; y &lt; en lugar de & y < sueltos en el texto.
  7. Nombres de pista cortos, con lo que los distingue al principio.
  8. Una prueba en el reproductor de destino: en nuestras pruebas, un archivo defectuoso fallaba a menudo sin ningún mensaje de error.