You are here

Elegir un códec de audio para Asterisk

Todos sabemos que Asterisk puede trabajar con diferentes códecs, lo que no está tan claro es cuál es el mejor para cada ocasión.

Para empezar vamos a ver que códecs soporta Asterisk y su ancho de banda necesario:

  • G.711 ulaw (utilizado en EEUU) (64 Kbps)
  • G.711 alaw (utilizado en Europa) (64 Kbps)
  • G.723.1 - pass-thru sin licencia (6.3/5.3Kbps) usado en H.323
  • G.726 - (16/24/32/40kbps)
  • G.729 - pass-thru sin licencia (8Kbps)
  • GSM (13Kbps)
  • iLBC (13.33/15.2Kbps)
  • LPC10 (no recomendado!) Sealed
  • Speex - configurable 4-48kbps

Vamos primero a ver un poco como funciona cada códec.

G.711 U-law:

El algoritmo Ley Mu (μ-law ó mu-law) es un sistema de cuantificación logarítmica de una señal de audio. Es utilizado principalmente para audio de voz humana. Este sistema de codificación es usado en EEUU y el Japón.

La implementación del sistema consiste en aplicar a la señal de entrada una función logarítmica y una vez procesada realizar una cuantificación uniforme. Es lo mismo que decir que el paso de cuantificación sigue una función del tipo logarítmico.

Esta función viene definida de la siguiente forma para un input x dado:

F(x) = sgn(x) \displaystyle\frac{\ln(1+ \mu |x|)} {\ln(1+\mu)} ~~~~ & \mbox{-1 \leq x \leq 1}

La letra μ indica el factor de compresión usado (μ = 255) en los estándares norteamericano y japonés. Si μ = 0 la entrada es igual a la salida.

La descompresión se realiza con la fórmula inversa:

F^{-1}(y) = sgn(y) (1 / \mu ) [(1 + \mu)^{|y|}- 1]~~~~-1 \leq y \leq 1

Utilizar G.711 para VoIP nos dará la mejor calidad de voz; ya que no usa ninguna compresión y es el mismo codec utilizado por la red RTC y líneas RDSI, suena como si utilizáramos un teléfono RDSI normal. También tiene la menor latencia puesto que no hay necesidad de compresión, lo cual cuesta menos capacidad de procesamiento. La pega es que utiliza más ancho de banda que otros códecs, hasta 84 Kbps incluyendo todo el overhead de TCP/IP. No obstante, aumentando el ancho de banda, esto no debería ser un problema.

G.711 A-law:

La ley A (A-Law) es un sistema de cuantificación logarítmica de señales de audio, usado habitualmente con fines de compresión en aplicaciones de voz humana. Está estandarizada por la ITU-T. Este sistema de codificación es usado en Europa.

El algoritmo Ley A basa su funcionamiento en un proceso de compresión y expansión llamado companding.
Se aplica una compresión/expansión de las amplitudes y posteriormente
una cuantificación uniforme. Las amplitudes de la señal de audio pequeñas son expandidas y las amplitudes más elevadas son comprimidas.

La implementación del sistema consiste en aplicar a la señal de entrada una función logarítmica y una vez procesada realizar una cuantificación uniforme.

Para una entrada x dada, la ecuación Ley A de salida es:

F(x) = sgn(x) \begin{cases} {A |x| \over 1 + \ln(A)}, & |x|

donde A es el parámetro de compresión. En Europa A = 87.7. También se usa el valor 87.6

La función inversa es la siguiente:

F^{-1}(y) = sgn(y) \begin{cases} {|y| (1 + \ln(A)) \over A}, & |y|

G.723.1:

Un standard ITU standard del tipo narrow-band audio codec que encodea el habla en una cadena de datos cada 30ms (240 muestras en total). Cada frame puede ser de 24 o 20 bytes de longitud, lo que hace a la cadena de datos tanto de 6.4kb/sec o 5.3kb/sec. Este códec esta cubierto por una variedad de patentes, lo que significa que debe ser pagada una patente antes de poder ser utilizado comercialmente.

G.726:

Un codec de onda ITU ADPCM con las siguientes características: 16/24/32/40 kbps, buena calidad y baja carga de procesador. Normalmente se usa en modo 32 kbit/s, ya que es la mitad del ratio de G.711, esto incrementa la capacidad de red usable en un 100%. Se usa principalmente en troncales internacionales en la red de telefonía. También es el códec estándar usado en teléfonos inalámbricos DECT.

G.729:

G.729 es un algoritmo de compresión de datos de audio para voz que comprime audio de voz en trozos de 10 milisegundos. La música o los tonos tales como los tonos de DTMF o de fax no pueden ser transportados confiablemente con este códec, y utilizar así G.711 o métodos de señalización fuera de banda para transportar esas señales.
G.729 se usa mayoritariamente en aplicaciones de Voz sobre IP VoIP por sus bajos requerimientos en ancho de banda. El estándar G.729 opera a una tasa de bits de 8 kbit/s, pero existen extensiones, las cuales suministran también tasas de 6.4 kbit/s y de 11.8 kbit/s para peor o mejor calidad en la conversación respectivamente. También es muy común G.729a el cual es compatible con G.729, pero requiere menos cómputo. Esta menor complejidad afecta en que la calidad de la conversación es empeorada marginalmente.

GSM:

GSM emplea una modulación GMSK (Gaussian Minimum Shift Keying) obtenida a partir de una modulación MSK que es un tipo especial de FSK. Para el acceso en el interfaz radio o Abis se utiliza el sistema TDMA de banda estrecha (Time Division Multiple Access) entre la estación base y el teléfono celular utilizando 2 de canales de radio de frecuencia dúplex. Para minimizar las fuentes de interferencia y conseguir una mayor protección se utiliza el (frequency hopping) o salto en frecuencia entre canales, con una velocidad máxima de 217 saltos/S. y siempre bajo mandato de la red.
Una llamada de voz utiliza un codificador GSM específico a velocidad total de 13Kbits/s, posteriormente se desarrolló un códec a velocidad mitad de 6,5 kbits/s que permitirá duplicar la capacidad de los canales TCH, se denomina FR (Full Rate) y HR (Half Rate).

ILBC:

iLBC, "Internet Low Bit rate Codec" es un codec para voz apropiado para comunicaciones robustas sobre VoIP. Este codec está diseñado para ahorrar ancho de banda y resulta en un carga útil de 13.33 Kb/s usando tramas de 30 ms y en 15.20 Kb/s usando tramas de 20 ms. El codec es capaz de enfrentar la eventualidad de que se pierdan tramas, lo cual ocurre cuando se pierde la conexión o se retrazan los paquetes IP.
El algoritmo iLBC, usa una codificación de predicción-lineal y bloques-independientes (LPC), este algoritmo tiene soporte para dos tamaños básicos de tramas: 20 ms a 15.2 Kb/s y 30 ms a 13.33 Kb/s.

Speex:

El proyecto Speex tiene como objetivo crear un códec libre para voz, sin restricciones de ninguna patente de software. Speex está sujeto a la Licencia BSD y es usado con el contenedor Ogg de la Fundación Xiph.org.
Las metas en el diseño eran permitir buena calidad en la voz y bajo bit-rate (desafortunadamente no al mismo tiempo). Buena calidad también significaba tener soporte para wideband (frecuencia de muestreo de 16 kHz) además de narrowband (calidad de teléfono, frecuencia de muestreo de 8 kHz).
El diseño para VoIP en vez de teléfonos celulares significa que Speex debe ser robusto a pérdida de paquetes, pero no corromperlos, entonces los paquetes llegan sin alteración o no llegan para nada. También, la idea era tener una complejidad y requerimiento en memoria razonable sin comprometer mucho la eficiencia del códec.

Conclusión:

Dicho esto, podemos empezar a hacernos una pequeña idea de que códec es el que más se adapta a nuestras necesidades. Yo creo que si tenemos un buen ancho de banda disponible podemos evitar la compresión. Aunque de todos modos también pueden afectarnos otros factores como patentes y licencias.

También nos puede resultar útil esta pequeña guía on-line para calcular el ancho de banda real de un códec.

Fuentes:

Voip Info

Wikipedia

Asterisk: 
Qué te parece: 

Comments

H ola
Antes que nada quiero felicitarte por tu pagina. Para mi, es una fuente de referencia importante.

Te escribo porque tengo una duda con respecto a los CODECS. Yo trabajo con el CODEC iLbc, y entiendo que èste e puede trabajar con tamaños de trama de 2 0 o 30
ms. En Asterisk, solo coloque el "enable=iLbc" en el trunk IAX, pero en ningun lado le indico el tamaño de la trama con la que deseo trabajar ¿donde puedo consultar cual esta tomando? y si deseo cambiarla ¿donde se hace?

Gracias

Sani

Hola,

por lo que yo sé el "frame size" o frecuencia de muestreo no se puede configurar en Asterisk. Ello debe configurarse en un User Agent (UA), es decir un softphone o hardphone que tenga soporte para el codec iLBC.

Ese softphone también debe ser capaz de ajustar el tamaño del paquete RTP (RTP Packet size) para el codec iLBC, bien en 20 ms o 30 ms.

Una vez seleccionado el tamaño del paquete Asterisk e iLBC se encargan del resto.

Con lo cual me dirigiría a buscar este parámetro en la configuración de tu UA compatible con iLBC.

Un saludo.

Hola

Gracias por responder. Pero el codec iLBC lo uso para interconectar dos Asterisk con IAX2. No hay User agent (es decir no softphone o no hardphone)

Saludos

Adriana