En este artículo pretendo explicar algunos conceptos sobre los codecs de audio que podemos usar en VoIP y aclarar cuál es el que conviene usar en distintos escenarios.

Para empezar debemos tener claro que es un códec y cuál es su función dentro de una llamada VoIP. audio_wave

Simplificando, un códec se encarga de muestrear y comprimir la señal analógica de voz para transmitirla de manera digital y descodificarla en el otro extremo para ser reproducida. En este proceso cada códec tiene distintas características que lo hacen válido para ciertos entornos. Entendiendo que a mayor calidad de audio, es decir, mayor tamaño de muestreo, también aumenta el consumo de ancho de banda que necesitamos para transmitir la conversación.

Vamos a ver uno por uno los cinco codecs más usados en VoIP.

G711, llamado generalmente ulaw (Japón y EEUU)  o alaw (Europa) atendiendo a al método de compresión antes de codificar la señal. Liberado en 1972. Este códec no tiene compresión a nivel de datos y junto su alta tasa de muestreo hace que sea un códec de extraordinaria calidad pero con una tasa de trasferencia de datos muy alta.

G722, conocido por ser una evolución de G711, se considera como un códec HD por la gran calidad de audio que ofrece. Existen otras dos versiones, G722.1 y G722.2, no son evoluciones del primero, si no versiones totalmente nuevas. De hecho G722.2 haciendo uso de la tecnología AMR – WB es capaz de adaptarse a las condiciones de la red de 6.6 a 23.85 kbps. Se suele usar para sistemas de multiconferencia.

GSM, un viejo conocido. Con un bitrate de 13Kbits/s y una calidad aceptable, ha sido una buena elección durante años en los softphones freeware que no disponen de licencia para otro códec y en escenarios con un ancho de banda limitado.

G729, el más extendido en VoIP, se trata de un códec que guarda una buena relación entre calidad y requerimiento de ancho de banda. Con este códec podríamos tener 8 conversaciones más que si estuviésemos usando G711 con el mismo consumo de ancho de banda. No me voy a meter en el jardín del licenciamiento, solo decir que, en Europa no es necesario pagar licencia por su uso y podemos conseguirlo de manera gratuita para muchas de las arquitecturas de procesador actuales.

Opus, uno de los codecs más novedosos y que en mi opinión el mejor. Capaz de adaptarse predictivamente a las condiciones de nuestra red, y dando una excelente calidad si nuestra red tiene capacidad para ello y seguir funcionando en la peor situación. Desarrollado por la IETF, lanzado el 12 de diciembre de 2012 bajo licencia BSD, lo que nos permite usarlo sin tener que pagar por ello. Por ejemplo en Vozelia ofrecen este codec tanto en su PBX (Centralita Virtual) como en sus cuentas de sip trunking.

Comparativa de codecs

CodecPublicaciónBitrateAncho de banda (Ethernet)
G711197264 kb/s87,2 Kbps
G722198864 kb/s87.2 Kbps
G72919968 kb/s31,2 kbps
Opus20126 kb/s a 510 kb/s 8 Kbps - 128 Kbps
GSM199213 kb/s28.63 Kbps

Vamos a comprobar cuantas llamadas podría tener activas una Raspberry Pi con Asterisk sin que el servicio tuviese pérdida de calidad.pi_asterisk

Requisitos:

  • Rasberry Pi con Raspbian.
  • Una maquina donde instalar SIPp.

En mi caso he instalado Asterisk desde los repositorios de debian. Con Raspbian 8.0 ( Conocer vuestra versión de Raspbian: “cat /etc/issue” ) debería instalaros Asterisk 11.13.1.

sudo apt-get install asterisk

En la configuración inicial de Asterisk hay un fallo, el el fichero /etc/asterisk/manager.conf realiza un include de todos los .conf que haya en /etc/asterisk/manager.d/

; #include "manager.d/*.conf"

 

Al final del fichero /etc/asterisk/sip.conf ponéis esto:

[sipp]
type=friend
context=sipp
host=dynamic
port=6000
user=sipp
canreinvite=no
disallow=all
allow=alaw
allow=ulaw

[100]
type=friend
context=sipp
host=dynamic
user=100
secret=<pass>
disallow=all
allow=ulaw

[101]
type=friend
context=sipp
host=dynamic
user=101
secret=<pass>
disallow=all
allow=ulaw

En el fichero /etc/asterisk/extensions.conf, creáis el contexto [sipp] para que nuestras extensiones puedan usarlo. Aquí incluimos al final del fichero:

[sipp]
exten => 1001,1,Answer
exten => 1001,n,SetMusicOnHold(default)
exten => 1001,n,WaitMusicOnHold(20)
exten => 1001,n,Hangup
exten => 1002,1,Answer
exten => 1002,n,Goto(demo,s,1)
exten => 1002,n,Hangup
exten => 100,1,Dial(SIP/100)
exten => 100,n,Hangup
exten => 101,1,Dial(SIP/101)
exten => 101,n,Hangup

Una vez introducidos estos cambios accedemos a la consola de Asterisk.

sudo asterisk –rvvvvvv

Ejecutamos “module reload”, veremos que el sistema recarga toda la configuración, no debe haber errores.

Ahora viene la parte para instalar SIPp. Mi máquina de pruebas para SIPp es una Ubuntu 16.0.4, podemos instalar SIPp directamente desde los repositorios, instalará la versión 3.2.

sudo apt-get install sip-tester

Donde hayamos instalado SIPp lanzamos el siguiente comando:
sipp –sn uac –d 10000 –s 1002 <ip host asterisk> -l 5 –mp 5606

-sn uac Escenario por defecto de SIPp
-d 10000 Tiempo de llamada en milisegundos
-s 1002 Usuario al que vamos a llamar en el otro extremo.
-l 5 Mantener 5 llamadas activas.
-mp 5606 Indicamos donde queremos que nos envíe el RTP de vuelta.

Con esto conseguimos mantener 5 conversaciones activas, de 10 segundos cada una y simulando audio en ambos sentidos. Así conseguiremos un escenario lo más próximo a llamadas reales.

Yo he mantenido dos SSH hacía mi máquina con Asterisk, un terminal con htop para ver los recursos en la Raspberry y otro con la consola de Asterisk para ver la salida.

En una segunda fase, vamos a realizar una llamada real entre dos extensiones para comprobar la calidad de la llamada. Aquí es donde comprobaremos fehacientemente si nuestra pequeña Raspberry está teniendo problemas para mover tantas llamadas.

Para ello, yo he configurado la extensión 100 y 101 que anteriormente hemos configurado en el sip.conf.

Con dos extensiones con el mismo códec (ulaw) hemos mantenido 40 llamadas activas sin que la conversación se viese afectada. Es un valor muy bueno teniendo en cuenta la potencia.

La cosa ha cambiado mucho cuando hemos lanzado una llamada entre ambas extensiones pero cada una con un códec (gsm-ulaw), hemos podido mantener unas 10 llamadas simultaneas.

Conclusiones:
Sin transcoding y sin usar funciones extra de Asterisk podríamos lanzar un numero aceptable de llamadas. Si todas nuestras llamadas van a tener transcoding no creo que se puedan mantener mas de 2 o 3 llamadas simultaneas.

Creo que podríamos mejorar el rendimiento dándole prioridad al proceso Asterisk y eliminando módulos de la configuración del mismo.

Hasta la próxima.

Iperf es una herramienta open source escrita en C, que nos permite medir valores de rendimiento de red creando flujos tanto TCP como UDP. Es multiplataforma, así que podremos hacer uso de ella tanto en Linux como también en Windows.

En mi caso usaré iperf2, existe una reescritura de iperf (iperf3) hecha en enero de 2014. Como quiero medir la calidad de la red para VozIP, los ejemplos serán con el protocolo UDP. Para VozIP lo importante es tener un jitter bajo y no tener perdida de paquetes.

Lado del servidor:

iperf -s -u -f MB -i1

-s Indica que este será el servidor.

-u Indica UDP

-f MB Para formatear la salida.

-i1 Para asignar 1 segundo de intervalo entre las tramas.

 

Lado cliente:

iperf -c 192.168.1.20 -u -f MB -t 60 -b 0.1m

-c  192.168.1.20 Host del servidor.

-u Medir UDP (también lo hemos indicado en el servidor)

-fMB Formato de salida.

-t60 Tiempo de envío, cuanto estará activo. Expresado en segundos.

-b 0.1m Ancho de banda bidireccional

 

 

Este es un comando muy útil cuando queremos copiar ficheros de una ubicación a otra y además conservar la estructura de directorios origen. Esto además de mantener un orden en destino nos evita machacar ficheros que se llamen igual.

En este ejemplo buscaremos con find los ficheros con extensión .log y gracias al parámetro -exec copiaremos todos ellos de /var/log/ a tu carpeta personal.
find /var/log -type f -name "*.log" -exec --parents cp {} /home/usuario/ \;

Espero os sea tan útil como a mi. Hasta el próximo tip.

Hola,

hace una semana me robaron mi querida Nikon D40 con el maravilloso Nikkor 35mm 1,8f. Una pena, ya que ese conjunto era un preciado tesoro. Aunque lo que mas me molestó fue sin duda el hecho de perder las fotos de un gran fin de semana en Sevilla. Lo dicho, una pena.

Así que decidí encontrar sustituta y la elegida ha sido una Nikon D5300. Compré un Kit en PCComponentes. Qué por cierto, llegó perfectamente pero las instrucciones en Checo, por lo que sospecho que compran a algun proveedor muy “chungo”. Por lo demás perfecto.

Y aquí un pequeño video de muestra, es realmente una maravilla lo que se puede conseguir con muy poco.

 

Cámara: Nikon D5300
Objetivo: Tamron 17-50 2.8f

Autor: Ólafur Arnalds
Canción: Near Light

debian-square_400x400Tras pelearme durante unas cuantas horas con la puesta en marcha de una Debian 7 en mi portátil, he recopilado los pasos que he dado después de mucho ir hacia delante y detrás herrando en muchos de ellos.
El objetivo era obtener un sistema de escritorio con Gnome, útil, sin demasiados añadidos y ante todo ligero, ya que el portátil donde lo iba a instalar tiene algún tiempo.

Voy a saltarme la parte de la instalación, existen muchos tutoriales en internet y creo que para alguien con unos mínimos conocimientos no resta dificultad. Google es tu amigo.

Mi único consejo en este punto es que uséis el netinstall, que seleccioneis “SSH server”, “Laptop” y “Standard system utilities” y que cuando comience la descarga desconectéis cualquier dispositivo de almacenamiento sobre todo antes de instalar Grub. A mi me instaló grub en un pendrive por lo que luego tuve que reinstalarlo.

Una vez instalada estos han sido los primeros pasos:

1) Configuración del sudo. Escribir:
su - "visudo"
Añadid esta linea: username ALL=(ALL) ALL (donde username es el usuario que habéis creado en la instalación)

Una vez hecho esto podremos seguir con los demás pasos sin tener que usar el root.

2) Es importante mantener el sistema actualizado.
sudo apt-get update
sudo apt-get upgrade

3) Repositorios, editamos el fichero /etc/apt/sources.list
Esta es la configuración que tengo para los repositiros, despues de estar leyendo un buen rato decidí dejarlo tal que así:

# deb http://ftp.cica.es/debian/ wheezy main

deb http://ftp.cica.es/debian/ wheezy main
deb-src http://ftp.cica.es/debian/ wheezy main

deb http://security.debian.org/ wheezy/updates main
deb-src http://security.debian.org/ wheezy/updates main

# wheezy-updates, previously known as ‘volatile’
deb http://ftp.cica.es/debian/ wheezy-updates main
deb-src http://ftp.cica.es/debian/ wheezy-updates main

# repositorios multimedia
# añadir key “sudo apt-get install deb-multimedia-keyring”
deb http://www.deb-multimedia.org wheezy main non-free
deb-src http://www.deb-multimedia.org wheezy main non-free

# repositorios non-free
deb http://ftp.es.debian.org/debian/ stable main contrib non-free
deb-src http://ftp.es.debian.org/debian/ stable main contrib non-free

Nos aseguramos de actualizar y comprobar que no hay errores en lo que hemos escrito, es posible que tengáis paquetes nuevos listos para descargar sobre todo por los repositorios multimedia añadidos. Sobre todo para codecs.

4) Si no tenemos costumbre de cada poco lanzar los comandos del paso 1, podemos estar enterados por notificaciones instalando:
sudo apt-get install apticron update-notifier-common debian-goodies

5) Drivers de video:
Como sabréis la gráfica suele ser un quebradero de cabeza. En mi caso tengo una “GeForce 9200M G” por lo que he instalado la versión 304 del driver.
Lo ideal es hacerlo desde synaptics, personalmente estuve siguiendo algunos tutoriales de como hacerlo descargando con apt-get lo necesario pero empezó a complicarse.
Tan solo tenéis que saber cual es la versión de vuestro kernel uname -r
Desde synaptics instalamos los siguientes paquetes:

nvidia-kernel-(tuversion de kernel)
nvidia-glx
nvidia-xconfig
nvidia-settings

En mi caso tras la instalación la pantalla se me quedó en negro, comprobé que no se había generado el fichero xorg.conf
Para recrearlo: sudo Xorg :1 -configure

Nos creará en /root un fichero xorg.conf.new, lo movemos a /etc/X11/ y listo.
sudo mv /root/xorg.conf.new /etc/X11/xorg.conf
6) Ajusté los botones de la barra de títulos de las ventanas para ponerlo a la derecha.
gsettings set org.gnome.shell.overrides button-layout ':minimize,maximize,close'

Hasta ahí todo bien, tenemos un escritorio ligero, con Gnome-Shell (que personalmente odio), ligero ya que ocupa unos 500mb en memoria, listo para usar, pero que presenta algunas carencias sobre todo en multimedia que son salvables pero que nos harán la vida un poco más dificil. Si este no es el cometido de tu sistema no tienes de que preocuparte.