El Atributo ONSTALLED

El atributo onstalled se activa cuando el navegador no puede recuperar datos multimedia de forma inesperada, generalmente debido a problemas de red o buffering.

El atributo onstalled se activa cuando el navegador no puede recuperar datos multimedia de forma inesperada, generalmente debido a problemas de red o buffering. Es esencial para manejar interrupciones en la reproducción de <audio> o <video>.


???? Sintaxis básica

html
Copy
<video 
    src="video.mp4" 
    controls
    onstalled="manejarInterrupcion(event)"
></video>
javascript
Copy
// Método alternativo con JavaScript
const video = document.getElementById("miVideo");
video.addEventListener("stalled", (event) => {
    // Lógica de manejo
});

???? Cuándo se dispara

  • Pérdida de conexión durante la reproducción

  • Buffering prolongado

  • Errores de red inesperados

  • Servidor de medios no responde


???? Ejemplos prácticos

1. Mostrar mensaje de advertencia

html
Copy
<video 
    id="reproductor" 
    src="stream.mp4" 
    controls
    onstalled="mostrarAlerta()"
    oncanplay="ocultarAlerta()"
></video>
<div id="alerta" style="display: none; color: red;">
    ¡Problema de conexión!
</div>

<script>
function mostrarAlerta() {
    document.getElementById("alerta").style.display = "block";
    console.log("Reproducción interrumpida");
}

function ocultarAlerta() {
    document.getElementById("alerta").style.display = "none";
}
</script>

2. Reintentar carga automáticamente

javascript
Copy
let reintentos = 0;

video.addEventListener("stalled", () => {
    if (reintentos < 3) {
        reintentos++;
        video.load();
        video.play();
    } else {
        alert("No se puede recuperar la conexión");
    }
});

???? Casos de uso avanzados

1. Sistema de reintentos inteligente

javascript
Copy
video.addEventListener("stalled", async () => {
    video.pause();
    
    // Esperar conexión
    const conexionRecuperada = await verificarConexion();
    
    if (conexionRecuperada) {
        video.play();
    } else {
        cambiarABitrateInferior();
    }
});

async function verificarConexion() {
    try {
        await fetch("https://ejemplo.com/ping", { method: "HEAD" });
        return true;
    } catch {
        return false;
    }
}

2. Registro de métricas de calidad

javascript
Copy
const metricas = {
    ultimoStalled: null,
    totalStalled: 0
};

video.addEventListener("stalled", () => {
    metricas.ultimoStalled = new Date();
    metricas.totalStalled++;
    
    // Enviar datos al servidor
    fetch("/analiticas", {
        method: "POST",
        body: JSON.stringify(metricas)
    });
});

⚠️ Consideraciones importantes

1. Diferencias entre eventos relacionados

Evento Descripción
onstalled Cuando el navegador no puede obtener datos
onwaiting Cuando la reproducción se pausa por buffering
onerror Cuando ocurre un error fatal

2. Compatibilidad

Navegador Soporte
Chrome ✅ 3+
Firefox ✅ 3.5+
Safari ✅ 5+
Edge ✅ 12+

3. Buenas prácticas

  • Combinar con onwaiting para manejar buffering

  • Usar preload="metadata" para optimizar carga inicial

  • Implementar timeout para evitar loops infinitos


???? Solución de problemas comunes

1. El evento no se dispara

javascript
Copy
// Forzar detección manual
video.addEventListener("progress", () => {
    if (video.buffered.length === 0 && video.networkState === 2) {
        video.dispatchEvent(new Event("stalled"));
    }
});

2. Manejo de conexiones lentas

javascript
Copy
let timeoutStalled;

video.addEventListener("stalled", () => {
    timeoutStalled = setTimeout(() => {
        mostrarOpcionesAlternativas();
    }, 5000); // Esperar 5 segundos
});

video.addEventListener("playing", () => {
    clearTimeout(timeoutStalled);
});

???? Conclusión

El atributo onstalled permite:

  • Mejorar la experiencia de usuario durante fallos de red

  • Implementar sistemas de recuperación automática

  • Recopilar datos de calidad de reproducción

  • Crear interfaces adaptativas a condiciones de red

Ejemplo final avanzado (Streaming adaptativo):

html
Copy
<video id="stream" controls></video>

<script>
const bitrates = {
    low: "video_480p.mp4",
    medium: "video_720p.mp4",
    high: "video_1080p.mp4"
};

let currentBitrate = "high";

video.addEventListener("stalled", () => {
    if (currentBitrate !== "low") {
        currentBitrate = "medium";
        cambiarCalidad(currentBitrate);
    } else {
        mostrarErrorConexion();
    }
});

function cambiarCalidad(nuevaCalidad) {
    video.src = bitrates[nuevaCalidad];
    video.play();
}
</script>

Con este conocimiento, podrás crear reproductores multimedia más robustos y resilientes. ¡Experimenta con diferentes estrategias de manejo de errores! ????????