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/vtty 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.

- Cabecera: la primera línea es
WEBVTT. Después de un espacio o un tabulador puedes añadir un título, comoWEBVTT - 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
NOTEnunca se muestra. Termina en la primera línea en blanco. - Bloque de estilo:
STYLEcontiene 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:0coloca el subtítulo arriba de la imagen,align:startlo alinea a la izquierda yposition:10%lo desplaza hacia la derecha. La especificación define seis:vertical,line,position,size,alignyregion. - 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&y<como<. 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:
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:
2
00:00:03,400 --> 00:00:06,800
la misma tarea en español, inglés,
alemán y francés.WEBVTT
2
00:00:03.400 --> 00:00:06.800
la misma tarea en español, inglés,
alemán y francés.| Aspecto | SRT | WebVTT |
|---|---|---|
| Primera línea | el número del primer subtítulo | WEBVTT |
| Antes de los milisegundos | coma | punto |
| Horas | siempre escritas | opcionales |
| Números | obligatorios | opcionales, cualquier identificador único |
| Codificación | no definida; YouTube y Vimeo piden UTF-8 | UTF-8, siempre |
| Posición y estilo | etiquetas sencillas, según el reproductor | ajustes, bloques STYLE, clases |
| Comentarios | no tiene | bloques NOTE |
Elemento <track> de los navegadores | Chrome lo rechazó en nuestra prueba | sí |
| lo acepta | no lo acepta | |
| YouTube | lo acepta, sin etiquetas de estilo | lo 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.
<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),captionspara subtítulos con sonidos y música,descriptions,chaptersometadata. Un valor no válido se trata comometadata, una pista para scripts que el público no ve. - srclang: el idioma de la pista; obligatorio si
kindessubtitles. - 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 sinlabelaparecía con su código de idioma. Si eracaptionsosubtitlessolo 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 atributocrossoriginy 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.
| Variante | Resultado |
|---|---|
| Válido: UTF-8, cabecera, puntos | 3 de 3 subtítulos |
| UTF-8 con BOM | 3 de 3 |
| Cabecera con un título tras un espacio | 3 de 3 |
Sin horas, como 00:01.000 | 3 de 3 |
| Guardado en Windows-1252 | 3 de 3, pero � en lugar de ä, ö, ü, ß y € |
Windows-1252, el servidor indica charset=windows-1252 | el mismo � |
Sin la línea WEBVTT | error, ningún subtítulo |
webvtt en minúsculas | error, ningún subtítulo |
WEBVTT seguido directamente de un guion | error, ningún subtítulo |
| Comas en todos los códigos de tiempo | carga sin error, pero 0 subtítulos |
| Una coma en un solo código de tiempo | 2 de 3, sin mensaje de error |
| Dos cifras de milisegundos | 2 de 3, sin mensaje de error |
Semirraya en la flecha: –> | 2 de 3, sin mensaje de error |
| Un archivo SRT como pista | error, 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:
�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:
- Borra la línea
WEBVTTy todos los bloques NOTE y STYLE. - Añade las horas que falten: busca
(?<![\d:])(\d\d:\d\d\.\d\d\d)y reemplaza por00:$1. - 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. - 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. - 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. - 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. - Cambia
<por<,>por>y, al final,&por&. - 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:
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:
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<,>y&; 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í:
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
| Plataforma | ¿VTT? | Qué saber |
|---|---|---|
| YouTube | sí | La posición funciona; el estilo se limita a negrita, cursiva y subrayado. Para empezar, YouTube recomienda SRT o SBV. |
| Vimeo | sí, recomendado | En UTF-8 y empezando por WEBVTT. |
| no | Solo 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. |
| PowerPoint | sí | WebVTT desde Office 2016, en Mac desde la versión 16.63; SRT en UTF-8 solo desde la versión 2411. |
| Microsoft Teams | descarga | Transcripciones en .docx o .vtt. |
| Zoom | descarga | Transcripciones de grabaciones en la nube en VTT. |
| H5P | sí | 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
- UTF-8, con o sin BOM.
- Primera línea exactamente
WEBVTT, como mucho con un título tras un espacio. - Códigos de tiempo con punto y tres cifras de milisegundos, en orden cronológico.
- Flechas escritas con dos guiones y el signo «mayor que».
- Bloques STYLE antes del primer subtítulo, sin líneas en blanco.
&y<en lugar de & y < sueltos en el texto.- Nombres de pista cortos, con lo que los distingue al principio.
- Una prueba en el reproductor de destino: en nuestras pruebas, un archivo defectuoso fallaba a menudo sin ningún mensaje de error.
