Nunca hasta hace unos días me había pasado algo similar, así que voy a comentarlo por aqui 🙂
El tema que hoy nos ocupa es el codec G722 y su interoperabilidad. Algo que en principio no debería preocuparnos, ya que si dos terminales utilizan el mismo codec todo deberia ir bien, ¿no? Pues no.
La semana pasada hablamos de esto en el VUC, porque aparentemente todos los softphones basados en PJSIP sufren del mismo problema: las llamadas en G722 suenan distorsionadas y con algo de superposición en el audio. Ya que en el VUC sólo se usa G722 (aunque se puede conectar por Skype o por SIP con G711 también) esto era importante así que Randy se puso a bombardear las listas de correo intentando encontrar respuesta al problema.
El Problema
En G722 el audio se muestrea a 16KHz con 14 bits. Peeeeero, como lo que nos vienen son 16 bits hay implementaciones que hacen cosas distintas: Asterisk y FreeSWITCH usan los primeros 14 bits y se olvidan de los 2 que sobran, y la cosa funciona. En cambio, PJSIP y VoiceAge hacen un bit-shifting de 2 bits, es decir, desplazan los 16 bits a la izquierda perdiendo los 2 de abajo. La cuestión es que esa diferencia de 2 bits se traduce en 12 dB, por lo que el audio se distorsiona, y al haber «movido» el audio se escuchan chasquidos extraños.
La solución
Obviamente no hay una unica solución, hay que ir a por la mas interoperable, así que he optado por hacer que PJSIP no haga el bit-shifting y así el audio en G722 fluye alegremente. 🙂
¿Alguna experiencia al respecto?
Ahhh, por eso decías que «2 bits pueden hacer que el audio vaya fatal…» no? bueno es saberlo.
En tiempo real no es sencillo, ya que la solución pasa por analizar el stream, de todos modos si te va bien descartando los dos bits de menos valor no debes tener problema. (ÑOÑ pero funciona) Por ahí tenía una rutina para mirar eso, que usaba para evitar problemas de ganancia en una aplicación de broadcast de radio. Si necesitas analizarlo en tiempo real (por mejorar la calidad del audio) busco en el «baul de los recuerdos»
A ver si entiendo. Soy PJsip y me llega RTP en G722. Lo recibo y lo quiero analizar. Obtengo del buffer de audio entrante 2 bytes, 16 bits (por aquello de que obviamente tiene que ser múltiplo de 8) y tengo que decidir si los 14 bits que realmente transportan el audio codificado son los 14 primeros o los 14 últimos, ¿verdad?
«múltiplo de 8 )», que si junto el «8» y el «)» el maldito blog hyper cool pone un icono de una jeta amarilla por las drogas y con gafas.
@ibc Mayormente eso es lo que he concluido que sucede. El tema es que ellos tienen un parche que hace que la implementacion de VoiceAge funcione. Con ese parche en cambio, Asterisk, presuntamente FreeSWITCH y el servicio online de conferencias ZipDX no funcionan.
He seguido haciendo pruebas y sin el parche (tal y como esta Blink ahora) tambien funciona con Snom, asi que pasando de VoiceAge…