El Atributo ONWAITING

Se activa cuando un elemento multimedia deja de reproducirse temporalmente debido a la falta de datos.

El atributo onwaiting se activa cuando un elemento multimedia (<video> o <audio>) deja de reproducirse temporalmente debido a la falta de datos (buffering). Es esencial para mejorar la experiencia del usuario durante interrupciones de carga.


???? Sintaxis básica

html
Copy
<!-- En HTML -->
<video 
    src="video.mp4" 
    controls 
    onwaiting="manejarBuffering(event)"
></video>

<!-- En JavaScript -->
<script>
  const video = document.getElementById("miVideo");
  video.addEventListener("waiting", () => {
    console.log("El video está cargando...");
  });
</script>

???? Cuándo se dispara

  • Cuando el reproductor agota el buffer y necesita más datos.

  • Durante fluctuaciones repentinas de la red.

  • Al saltar a una posición no cargada del contenido.


???? Ejemplos prácticos

1. Mostrar un spinner de carga

html
Copy
<video id="reproductor" src="video.mp4" controls></video>
<div id="spinner" style="display: none;">Cargando...</div>

<script>
  const video = document.getElementById("reproductor");
  const spinner = document.getElementById("spinner");

  video.addEventListener("waiting", () => {
    spinner.style.display = "block";
  });

  video.addEventListener("playing", () => {
    spinner.style.display = "none";
  });
</script>

2. Cambiar a calidad baja durante el buffering

javascript
Copy
video.addEventListener("waiting", async () => {
  if (video.currentTime > 10) { // Si ya lleva tiempo reproduciendo
    video.src = "video_baja_calidad.mp4";
    await video.play();
  }
});

⚠️ Diferencias clave con eventos similares

Evento Descripción
onwaiting Falta temporal de datos (buffering activo)
onstalled Error permanente para cargar datos
onpause Pausa manual por el usuario
onsuspend Carga detenida intencionalmente

???? Compatibilidad

Navegador Soporte
Chrome ✅ 15+
Firefox ✅ 12+
Safari ✅ 6+
Edge ✅ 12+

???? Mejores prácticas

  1. Combinar con onplaying para alternar UI:

    javascript
    Copy
    let isLoading = false;
    video.addEventListener("waiting", () => (isLoading = true));
    video.addEventListener("playing", () => (isLoading = false));
  2. Optimizar preload:

    html
    Copy
    <video preload="auto" ...> <!-- Precarga más datos inicialmente -->
  1. Evitar lógica pesada:

    javascript
    Copy
    video.addEventListener("waiting", () => {
      requestAnimationFrame(mostrarSpinner); // Optimizar rendimiento
    });

???? Solución de problemas

  1. Evento no se dispara:

    • Verificar si el src del video es válido.

    • Reducir la calidad del video para forzar buffering en pruebas.

  2. Spinner no desaparece:

    • Asegurarse de escuchar también el evento playing.


???? Caso de uso avanzado: Sistema de buffer inteligente

html
Copy
<video id="videoStream" controls></video>
<div class="buffer-status">
  <div class="buffer-bar"></div>
</div>

<script>
  const video = document.getElementById("videoStream");
  const bufferBar = document.querySelector(".buffer-bar");

  video.addEventListener("progress", () => {
    const buffered = video.buffered.end(0);
    const duration = video.duration;
    bufferBar.style.width = `${(buffered / duration) * 100}%`;
  });

  video.addEventListener("waiting", () => {
    bufferBar.style.backgroundColor = "red"; // Alerta de buffering
  });

  video.addEventListener("playing", () => {
    bufferBar.style.backgroundColor = "#2ecc71"; // Normalizar
  });
</script>

<style>
  .buffer-status {
    width: 100%;
    height: 5px;
    background: #ddd;
  }
  .buffer-bar {
    height: 100%;
    transition: width 0.3s, background 0.2s;
  }
</style>

???? Conclusión

El atributo onwaiting permite:

  • Mejorar la UX con feedback visual durante el buffering.

  • Implementar estrategias de recuperación automática.

  • Integrar análisis de calidad de red.

  • Crear interfaces de reproductor profesionales.

Ejemplo final avanzado (Adaptación dinámica):

javascript
Copy
video.addEventListener("waiting", async () => {
  const bitrate = await calcularBitrateOptimo();
  video.src = obtenerURLConBitrate(bitrate);
  video.play();
});

Con este conocimiento, podrás manejar eficientemente las interrupciones de reproducción y crear reproductores más resilientes. ¡Experimenta con diferentes técnicas!