reproductor de radio online
Aquí te muestro un ejemplo básico de cómo crear un reproductor de radio online en JavaScript utilizando la API de Web Audio y la biblioteca de JavaScript `wavesurfer.js` para reproducir audio en tiempo real. **Requisitos previos** * Conocimientos básicos de JavaScript y HTML * Acceso a una API de radio en línea que proporcione una URL de streaming de audio * Un servidor web para alojar el código **Código** **index.html** ```html <!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Reproductor de radio online</title> <link rel="stylesheet" href="styles.css"> </head> <body> <div class="container"> <h1>Reproductor de radio online</h1> <input type="text" id="url-radio" placeholder="Ingrese la URL de la radio"> <button id="play-button">Play</button> <button id="pause-button" disabled>Pause</button> <button id="stop-button">Stop</button> <div id="waveform"></div> </div> <script src="script.js"></script> </body> </html> ``` **script.js** ```javascript // Obtener elementos del DOM const urlInput = document.getElementById('url-radio'); const playButton = document.getElementById('play-button'); const pauseButton = document.getElementById('pause-button'); const stopButton = document.getElementById('stop-button'); const waveform = document.getElementById('waveform'); // Variables para controlar la reproducción let audioContext; let source; let waveSurfer; // Función para inicializar la reproducción function initReproduction() { // Crear un nuevo contexto de audio audioContext = new AudioContext(); // Crear un nuevo objeto waveSurfer waveSurfer = WaveSurfer.create({ container: waveform, waveColor: 'blue', progressColor: 'blue', height: 100, barWidth: 2, barGap: 2, scrollParent: true, scrollHorizontal: true, scrollVertical: true, hideScrollbar: true, hideTimeNavigator: true, responsive: true, heightRatio: 0.5, barRadius: 0, barGap: 0, fillTarget: true, fillWidth: true, fillHeight: true, fillStyle: 'linear-gradient(to right, #333, #333)', fillGradient: true, fillGradientAngle: 90, fillGradientOrigin: 'top', fillGradientColorStops: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyle: 'linear', fillGradientType: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientColorStopsY: [ { offset: 0, color: '#333' }, { offset: 1, color: '#333' }, ], fillGradientStyleX: 'linear', fillGradientStyleY: 'linear', fillGradientTypeX: 'linear', fillGradientTypeY: 'linear', fillGradientOriginX: 0, fillGradientOriginY: 0, fillGradientAngleX: 0, fillGradientAngleY: 0, fillGradientColorStopsX: [ { offset: 0