Estoy tratando de implementar una función en la que un cliente pueda grabar audio ( MediaRecorder ) y enviarlo a un servidor. Luego, el servidor crea un enlace donde un cliente diferente puede descargar la transmisión en vivo.
Y todo funciona bien, excepto por un detalle: la transmisión se retrasa alrededor de 4 segundos. Creo que esto tiene que ver con el almacenamiento en búfer del audioNode.
Esto es lo que creo que está sucediendo: el audioNode espera hasta que haya 4 segundos de sonido disponibles. Dado que el sonido se crea en vivo, debe esperar 4 segundos para que los datos estén disponibles.
Entonces mi pregunta es: ¿cómo puedo deshabilitar o reducir el tamaño del búfer de un nodo de audio?
Estoy usando electron como mi "navegador" o como se llame.
La solicitud http (flujo de descarga) se ve así:
En el código javascript, simplemente adjunto el enlace a mi sourceNode:
audioNode = document.getElementById("callAudio") audioNode.volume = 1.0 const audioSourceNode = document.getElementById("callAudioSource") const audioContext = new window.AudioContext() const audioTrack = audioContext.createMediaElementSource(audioNode) const audioGain = audioContext.createGain() const audioDestination = audioContext.createMediaStreamDestination(); const audioTrack.connect(audioGain).connect(audioDestination) audioSourceNode.setAttribute("src", "http://localhost:12347") audioNode.load() audioNode.play().then(() => { console.debug("started playing after:", currentTime) playing = true })El audioNode en sí se ve así:
<audio controls id="callAudio" class="audioControls" crossorigin="anonymous" preload="none"> <source src="" id="callAudioSource"></src> </audio>La depuración me dice que tardó aproximadamente 4,2 segundos en comenzar a jugar.
Cuando observo esta transmisión desde la perspectiva de mi servidor, veo que tengo un retraso de menos de 10 ms. Por lo tanto, esto no puede deberse a que el servidor produzca un retraso.