Cómo Embeber Video en React
Embeber video en una aplicación React parece sencillo hasta que te topas con un autoplay roto, un iframe que no es responsive, o una etiqueta <embed> que simplemente no funciona. Esta guía cubre los dos enfoques más prácticos: el elemento nativo HTML5 <video> para archivos auto-hospedados, y los embeds con <iframe> para plataformas como YouTube y Vimeo. Las librerías de terceros se mencionan solo cuando aportan un valor real, no como opción por defecto.
Puntos Clave
- Usa el elemento nativo HTML5
<video>para archivos auto-hospedados. No se requiere ninguna librería. - Para los embeds de YouTube, un
<iframe>simple apuntando ayoutube-nocookie.comes el enfoque estándar y respetuoso con la privacidad. - El autoplay requiere el atributo
mutedpara funcionar de forma confiable en Chrome, Safari y Firefox. playsInlinees esencial en iOS para evitar que la reproducción se fuerce en pantalla completa.- Recurre a una librería como ReactPlayer solo cuando necesites una API unificada entre múltiples proveedores o callbacks de eventos avanzados.
Método 1: Video HTML5 en React para Archivos Auto-Hospedados
Si controlas el archivo de video, el elemento nativo <video> es la herramienta adecuada. No necesitas ninguna librería.
import myVideo from './assets/demo.mp4';
export default function VideoPlayer() {
return (
<video
width="100%"
style={{ aspectRatio: '16/9' }}
controls
playsInline
muted
>
<source src={myVideo} type="video/mp4" />
<track
kind="subtitles"
src="/captions/demo.en.vtt"
srcLang="en"
label="English"
default
/>
Your browser does not support the video tag.
</video>
);
}
Algunos puntos a tener en cuenta:
autoPlayrequieremutedpara funcionar de forma confiable en los navegadores modernos. Chrome, Safari y Firefox bloquean por defecto el autoplay sin silenciar. No asumas que funcionará sinmuted. Ten en cuenta que en JSX el atributo se escribe en camelCase comoautoPlay, noautoplay. El soporte de navegadores y las políticas de autoplay están documentados en Can I Use.playsInlinees necesario en iOS para evitar que el video se abra automáticamente en pantalla completa.<track>añade subtítulos o leyendas. Es la forma correcta de manejar la accesibilidad del contenido en video, y es algo fácil de pasar por alto.- El texto de respaldo dentro de
<video>solo aparece en navegadores muy antiguos que no reconocen el elemento. Aun así, vale la pena incluirlo.
Para formatos de streaming adaptativo como HLS (.m3u8), el soporte nativo del navegador varía. Safari maneja HLS de forma nativa, pero Chrome y Firefox requieren una librería como hls.js para analizar y reproducir el stream.
Embed de YouTube en React: Usando un iframe
Para YouTube o Vimeo, un <iframe> es el enfoque estándar. No necesitas un paquete específico de React para esto.
export default function YouTubeEmbed({ videoId }) {
return (
<div style={{ aspectRatio: '16/9', width: '100%' }}>
<iframe
width="100%"
height="100%"
src={`https://www.youtube-nocookie.com/embed/${videoId}`}
title="YouTube video player"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
style={{ border: 'none' }}
/>
</div>
);
}
Detalles clave:
- Usa
youtube-nocookie.comen lugar deyoutube.compara la URL del embed. Este es el modo de privacidad mejorada de YouTube, que reduce las cookies de seguimiento hasta que el usuario interactúa con el reproductor. titlees obligatorio en los iframes para los lectores de pantalla. Sin él, las tecnologías de asistencia no tienen manera de describir el contenido embebido.aspectRatio: '16/9'en el contenedor, junto conwidth: 100%yheight: 100%en el iframe, es el enfoque responsive más limpio usando CSS moderno. No se requieren trucos con padding. El soporte del navegador para la propiedad CSSaspect-ratioestá disponible en Can I Use.- El formato de la URL del embed es
https://www.youtube-nocookie.com/embed/{VIDEO_ID}. El ID del video es el valor del parámetro de consultaven una URL estándar de YouTube (por ejemplo, la parte después de?v=enyoutube.com/watch?v=VIDEO_ID).
Puedes pasar parámetros adicionales mediante el query string:
/embed/VIDEO_ID?controls=1&rel=0
Discover how at OpenReplay.com.
Cuándo Usar una Librería de Reproductor de Video en React
Para la mayoría de los casos de uso, el elemento nativo <video> o un iframe simple son suficientes. Considera una librería como ReactPlayer si necesitas dar soporte a múltiples plataformas (YouTube, Vimeo, Wistia, HLS, DASH) desde un único componente con una API unificada, o si necesitas callbacks de eventos como onReady, onProgress u onEnded en distintos proveedores.
ReactPlayer agrega un peso considerable al bundle, por lo que vale la pena evaluar si realmente necesitas esa flexibilidad antes de añadirlo como dependencia.
Conclusión
Empieza con la herramienta más simple que funcione. Para video auto-hospedado, utiliza el elemento HTML5 <video> con controls, playsInline, y muted si necesitas autoplay. Para los embeds de YouTube en React, un simple <iframe> apuntando a youtube-nocookie.com con un atributo title adecuado es todo lo que necesitas. Recurre a una librería solo cuando el enfoque nativo realmente se quede corto.
Preguntas Frecuentes
Los navegadores modernos bloquean el autoplay para videos con sonido. Para que el autoplay funcione de forma confiable en Chrome, Safari y Firefox, tu elemento de video debe incluir el atributo muted junto con autoPlay. En iOS, también necesitas playsInline, de lo contrario el video puede negarse a reproducirse en línea o abrirse en pantalla completa. Sin estos, el autoplay fallará silenciosamente.
Usa youtube-nocookie.com siempre que sea posible. Es el modo de embed con privacidad mejorada de YouTube, que evita establecer cookies de seguimiento hasta que el usuario interactúa realmente con el reproductor. La funcionalidad principal de reproducción es básicamente la misma que en los embeds estándar, pero es más amigable para el cumplimiento de la privacidad y ayuda a reducir las advertencias de cookies de terceros en tu sitio.
No para los casos de uso típicos. El elemento nativo HTML5 video maneja archivos auto-hospedados, y un iframe simple maneja YouTube o Vimeo. Recurre a ReactPlayer solo cuando necesites una única API unificada entre múltiples proveedores o callbacks de eventos consistentes como onProgress y onEnded. De lo contrario, el costo en el bundle rara vez se justifica.
Envuelve el video o iframe en un contenedor con aspectRatio establecido en 16/9 y width al 100%. Luego configura el elemento interno con width al 100% y height al 100%. Este enfoque moderno de CSS reemplaza los antiguos trucos de padding-bottom y mantiene el video proporcional en todos los tamaños de pantalla sin cálculos manuales.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers. Check our GitHub repo and join the thousands of developers in our community.