Contenido del Artículo
Elementos Multimedia HTML5
HTML5 introdujo elementos nativos para multimedia con amplia compatibilidad:
<video>
Soporte para formatos MP4, WebM, Ogg con controles nativos
<audio>
Reproducción de sonido con API completa para control
<track>
Sincronización de subtítulos, capítulos y metadatos
<!-- Ejemplo básico con fuentes alternativas -->
<video controls width="640" poster="preview.jpg">
<source src="video.mp4" type="video/mp4">
<source src="video.webm" type="video/webm">
<track label="Español" kind="subtitles" srclang="es" src="subtitles.vtt" default>
<p>Tu navegador no soporta el elemento video. Descarga el <a href="video.mp4">video</a>.</p>
</video>
<audio controls>
<source src="audio.mp3" type="audio/mpeg">
<source src="audio.ogg" type="audio/ogg">
</audio>
Control con JavaScript API
La API multimedia permite control avanzado mediante JavaScript:
const video = document.getElementById('miVideo');
// Eventos clave
video.addEventListener('loadedmetadata', () => {
console.log(`Duración: ${video.duration}s`);
});
video.addEventListener('timeupdate', () => {
console.log(`Tiempo actual: ${video.currentTime}s`);
});
// Métodos de control
function togglePlay() {
video.paused ? video.play() : video.pause();
}
function setSpeed(speed) {
video.playbackRate = speed;
}
// Acceso a pistas de texto
const tracks = video.textTracks; // Array de pistas <track>
const spanishSubs = tracks.getTrackById('spanish');
spanishSubs.mode = 'showing'; // Mostrar subtítulos
La propiedad textTracks
permite manipular subtítulos, capítulos y metadatos sincronizados
Propiedad | Descripción |
---|---|
currentTime | Tiempo actual de reproducción (segundos) |
duration | Duración total del medio |
volume | Nivel de volumen (0 a 1) |
playbackRate | Velocidad de reproducción (1 = normal) |
textTracks | Colección de pistas de texto asociadas |
Formatos y Codecs Modernos
Optimización para diferentes navegadores y dispositivos:
Video
H.264 (MP4), VP9 (WebM), AV1 (futuro estándar)
Audio
AAC, MP3, Opus (mejor calidad/compresión)
Subtítulos
WebVTT (formato estándar para pistas de texto)
<!-- Ejemplo con formatos alternativos para máxima compatibilidad -->
<video controls>
<!-- Orden óptimo: WebM/VP9 primero por menor tamaño -->
<source src="video.webm" type="video/webm; codecs=vp9,opus">
<source src="video.mp4" type="video/mp4; codecs=avc1.4d002a,mp4a.40.2">
<!-- Fallback para Safari -->
<source src="video.mov" type="video/quicktime">
</video>
Accesibilidad Multimedia
Técnicas para contenido multimedia accesible:
<!-- Ejemplo accesible -->
<video controls aria-describedby="videoDesc">
<source src="video.mp4" type="video/mp4">
<track kind="captions" src="captions.vtt" srclang="es" label="Español" default>
<track kind="descriptions" src="descriptions.vtt" srclang="es">
</video>
<div id="videoDesc">
Video tutorial sobre accesibilidad web. Duración: 5 minutos.
</div>
<!-- Transcripción accesible -->
<details>
<summary>Transcripción del video</summary>
<div id="transcript">
<!-- Contenido de la transcripción -->
</div>
</details>
Las pistas de tipo descriptions
proveen audio-descripción para usuarios con discapacidad visual
Técnica | Beneficio |
---|---|
Subtítulos (captions) | Para usuarios sordos o entornos silenciosos |
Audio-descripción | Describe elementos visuales importantes |
Transcripción | Acceso al contenido sin necesidad de reproducción |
Controles teclado | Navegación para usuarios que no usan mouse |
ARIA labels | Contexto para lectores de pantalla |
Optimización de Rendimiento
Técnicas para mejorar la carga y reproducción:
Carga progresiva
Atributo preload='metadata' para balancear rendimiento
Adaptive Streaming
HLS o DASH para calidad adaptativa
Lazy Loading
loading='lazy' para videos fuera de pantalla
<!-- Video optimizado -->
<video
controls
preload="metadata"
poster="preview-lowres.jpg"
data-src="video.mp4"
class="lazy"
>
<source data-src="video-720p.mp4" media="(min-width: 1024px)">
<source data-src="video-480p.mp4" media="(min-width: 768px)">
</video>
<script>
// Lazy loading para video
document.addEventListener('DOMContentLoaded', () => {
const lazyVideos = document.querySelectorAll('video.lazy');
const lazyVideoObserver = new IntersectionObserver((entries) => {
entries.forEach((video) => {
if(video.isIntersecting) {
video.target.querySelectorAll('source').forEach((source) => {
source.src = source.dataset.src;
});
video.target.load();
lazyVideoObserver.unobserve(video.target);
}
});
});
lazyVideos.forEach((video) => {
lazyVideoObserver.observe(video);
});
});
</script>