El Atributo ONRATECHANGE

El atributo onratechange detecta cambios en la velocidad de reproducción (playback rate) de elementos multimedia

El atributo onratechange detecta cambios en la velocidad de reproducción (playback rate) de elementos multimedia (<audio> o <video>). Es útil para:

  • Crear controles personalizados de velocidad

  • Sincronizar efectos visuales con la velocidad

  • Implementar características educativas (ej: cursos en video)

  • Registrar preferencias de usuarios


???? Sintaxis Básica

html
Copy
<video 
    src="video.mp4" 
    onratechange="manejarCambioVelocidad(event)"
></video>
javascript
Copy
// Mediante JavaScript:
elementoMedia.addEventListener('ratechange', (event) => {
    // Lógica aquí
});

???? Propiedades Clave

  • playbackRate: Velocidad actual (1.0 = normal, 2.0 = 2x)

  • defaultPlaybackRate: Velocidad predeterminada


???? Ejemplos Prácticos

1. Monitor Básico de Velocidad

html
Copy
<video id="miVideo" src="video.mp4" controls onratechange="actualizarVelocidad()"></video>
<p>Velocidad actual: <span id="velocidad">1x</span></p>

<script>
function actualizarVelocidad() {
    const video = document.getElementById('miVideo');
    document.getElementById('velocidad').textContent = 
        `${video.playbackRate.toFixed(1)}x`;
}
</script>

2. Controlador Personalizado de Velocidad

html
Copy
<video id="videoPlayer" src="clase.mp4" controls></video>
<div class="speed-controls">
    <button onclick="cambiarVelocidad(0.5)">0.5x</button>
    <button onclick="cambiarVelocidad(1)">Normal</button>
    <button onclick="cambiarVelocidad(1.5)">1.5x</button>
    <input 
        type="range" 
        min="0.5" 
        max="3" 
        step="0.25" 
        value="1"
        oninput="cambiarVelocidad(this.value)"
    >
</div>

<script>
const video = document.getElementById('videoPlayer');

// Actualizar velocidad y UI
function cambiarVelocidad(rate) {
    video.playbackRate = parseFloat(rate);
}

// Detectar cambios automáticos
video.addEventListener('ratechange', () => {
    document.querySelector('input[type="range"]').value = video.playbackRate;
});
</script>

<style>
.speed-controls {
    margin: 15px;
    padding: 10px;
    background: #f0f0f0;
}
</style>

3. Sincronización de Subtítulos

html
Copy
<video id="videoTutorial" src="tutorial.mp4" onratechange="ajustarSubtitulos()"></video>
<div id="subtitulos"></div>

<script>
const subtitles = [
    { time: 0, text: "Introducción..." },
    { time: 5, text: "Primer concepto clave..." },
    { time: 10, text: "Ejemplo práctico..." }
];

function ajustarSubtitulos() {
    const video = document.getElementById('videoTutorial');
    const adjustedTime = video.currentTime / video.playbackRate;
    
    const currentSub = subtitles.find(sub => 
        adjustedTime >= sub.time && adjustedTime < sub.time + 3
    );
    
    document.getElementById('subtitulos').textContent = 
        currentSub?.text || '';
}
</script>

???? Casos de Uso Avanzados

1. Sistema de Aprendizaje Adaptativo

javascript
Copy
// Ajustar velocidad según complejidad del contenido
const segmentosVideo = [
    { start: 0, end: 30, velocidadRecomendada: 1.0 },
    { start: 30, end: 60, velocidadRecomendada: 0.75 }
];

video.addEventListener('timeupdate', () => {
    const segmentoActual = segmentosVideo.find(seg => 
        video.currentTime >= seg.start && video.currentTime < seg.end
    );
    
    if (segmentoActual && video.playbackRate !== segmentoActual.velocidadRecomendada) {
        video.playbackRate = segmentoActual.velocidadRecomendada;
    }
});

2. Análisis de Hábitos de Usuario

javascript
Copy
let velocidadCambios = [];

video.addEventListener('ratechange', () => {
    velocidadCambios.push({
        tiempo: video.currentTime,
        velocidad: video.playbackRate,
        fecha: new Date()
    });
    
    // Enviar datos al servidor cada 30 segundos
    if (video.currentTime % 30 === 0) {
        enviarAnaliticas(velocidadCambios);
        velocidadCambios = [];
    }
});

3. Efectos de Sonido Adaptativos

html
Copy
<audio id="audioLibro" src="audiobook.mp3"></audio>

<script>
const audio = document.getElementById('audioLibro');
const context = new AudioContext();
const source = context.createMediaElementSource(audio);

// Ajustar tono al cambiar velocidad
audio.addEventListener('ratechange', () => {
    const playbackRate = audio.playbackRate;
    const pitchShift = playbackRate > 1 ? 1.2 : 0.8;
    
    // Aplicar efecto de tono (requiere Web Audio API)
    const pitchNode = new PitchShift(context);
    pitchNode.pitch = pitchShift;
    source.connect(pitchNode).connect(context.destination);
});
</script>

⚠️ Consideraciones Importantes

  1. Límites de Velocidad:

    javascript
    Copy
    // Verificar velocidades soportadas
    video.addEventListener('ratechange', () => {
        if (video.playbackRate < 0.5 || video.playbackRate > 4) {
            console.warn('Velocidad no soportada');
            video.playbackRate = 1.0;
        }
    });
  2. Compatibilidad:

    Navegador Soporte
    Chrome ✅ 20+
    Firefox ✅ 15+
    Safari ✅ 7+
    Edge ✅ 12+
  3. Mejores Prácticas:

    • Usar toFixed() para mostrar valores decimales limpios

    • Combinar con timeupdate para efectos precisos

    • Proporcionar feedback visual inmediato


???? Conclusión

El atributo onratechange permite:

  • Crear experiencias multimedia interactivas

  • Adaptar contenido al comportamiento del usuario

  • Desarrollar herramientas educativas avanzadas

  • Recopilar datos de uso valiosos

Ejemplo Final (Control Profesional):

html
Copy
<div class="video-container">
    <video id="proPlayer" src="video.mp4"></video>
    <div class="controls">
        <button class="speed-btn" data-rate="0.75">0.75x</button>
        <button class="speed-btn active" data-rate="1">1x</button>
        <button class="speed-btn" data-rate="1.25">1.25x</button>
        <button class="speed-btn" data-rate="1.5">1.5x</button>
    </div>
</div>

<script>
const player = document.getElementById('proPlayer');
document.querySelectorAll('.speed-btn').forEach(btn => {
    btn.addEventListener('click', () => {
        const rate = parseFloat(btn.dataset.rate);
        player.playbackRate = rate;
        
        document.querySelectorAll('.speed-btn').forEach(b => 
            b.classList.remove('active')
        );
        btn.classList.add('active');
    });
});

player.addEventListener('ratechange', () => {
    const currentRate = player.playbackRate;
    document.querySelector(`[data-rate="${currentRate}"]`)?.classList.add('active');
});
</script>

<style>
.speed-btn.active {
    background: #2ecc71;
    color: white;
}
</style>

Con este conocimiento, podrás implementar controles profesionales de velocidad en tus proyectos multimedia. ¡Experimenta y optimiza la experiencia de usuario! ????????