rtcpeerconnection - HTML5 y aplicaciones de audio web: transmisión de datos de micrófono desde el navegador al servidor. Transportes ideales y compresión de datos
webrtc server (2)
Estoy buscando tomar la entrada de audio del navegador y transmitirla a múltiples oyentes. El uso previsto es para música, por lo que la calidad debe ser estándar de mp3 o más o menos.
He intentado de dos maneras, ambas dando resultados no exitosos:
WebRTC
- Transmitir audio directamente entre navegadores funciona bien, pero la calidad del audio parece no ser personalizable a pesar de lo que he visto. (He visto que está usando el códec de audio Opus, pero parece no exponer ningún control).
- ¿Alguien tiene alguna idea sobre cómo aumentar la calidad del audio en las transmisiones WebRTC?
Websockets
El problema es el transporte del navegador al servidor. Los datos de audio PCM que puedo adquirir a través del siguiente método han demostrado ser demasiado grandes para transmitirlos repetidamente al servidor a través de websockets. La transmisión funciona perfectamente en entornos de Internet de alta velocidad, pero con wifi más lento no es utilizable.
var context = new webkitAudioContext() navigator.webkitGetUserMedia({audio:true}, gotStream) function gotStream (stream) { var source = context.createMediaStreamSource(stream) var proc = context.createScriptProcessor(2048, 2, 2) source.connect(proc) proc.connect(context.destination) proc.onaudioprocess = function(event) { var audio_data = event.inputBuffer.getChannelData(0)|| new Float32Array(2048) console.log(audio_data) // send audio_data to server } }
Entonces la pregunta principal es, ¿hay alguna forma de comprimir los datos PCM para facilitar la transmisión al servidor? ¿O tal vez hay una forma más fácil de hacerlo?
Hay muchas formas de comprimir datos de PCM, claro, pero de manera realista, su mejor opción es hacer que WebRTC funcione correctamente. WebRTC está diseñado para hacer esto, transmitir medios de forma adaptativa, aunque no define a qué se refiere con oyentes "múltiples" (hay una gran diferencia entre 3 oyentes y 300,000 oyentes simultáneos).
Hay varias maneras posibles de remuestrear y / o comprimir sus datos, ninguno de ellos nativo. Reescribí los datos en 8Khz Mono (su kilometraje puede variar) con la lib xaudio.js del entorno speex.js . También puedes comprimir la transmisión con speex, aunque normalmente se usa solo para audio. En su caso, probablemente enviaría la transmisión a un servidor, la comprimiría allí y la transmitiría a su audiencia. Realmente no creo que un simple navegador sea lo suficientemente bueno como para servir datos a una gran audiencia.