A importância dos Codecs

by

Caros colegas,

Novamente tomo a liberdade para escrever no blog do Ensinar. Acredito que este seja um assunto de interesse geral e voltado a todos que trabalham com telefonia IP e VoIP. Este artigo busca fazer entender o que é um codec, quais suas características e critérios para implementação dentro de um servidor Asterisk. Devo frisar que a fonte desse post provém do conteúdo da revista Linux Magazine “Especial 3 – VoIP com Asterisk”, baseado em uma análise escrita por Flávio E. Gonçalves.

Um boa leitura para todos!

 

Introdução

Primeiramente devemos definir o que é um codec. Um codec (coder-decoder) é um codificador-decodificador (traduzindo ao “pé da letra”), de um sinal ou um fluxo de dados digitais. Temos um exemplo abaixo que mostra como funciona a codificação PCM (Pulse Code Modulation):

No caso um sinal analógico de 4000 Hz (faixa da voz humana) é amostrado , quantizado e codificado, gerando um fluxo digital de 8000 amostras, cada uma codificada em 8 bits de dados, consumindo 64kbps de banda, que será transmitido para o sistema. De acordo com a norma da ITU G.711 existem 2 tipos de algoritmos para codificar um sinal PCM: Mu-law e A-law, designados no Asterisk como “ulaw” e “alaw”. O primeiro é usado nos EUA e Japão, enquanto o segundo é usado em quase todos os países. Existem várias características que devem ser entendidas em relação a um codec. Abaixo temos uma tabela com os codecs mais conhecidos e usados no Asterisk e a seguir focaremos em algumas características e pontos importantes a respeito dos codecs.

 

Tabela comparativa dos Codecs
Codecs G.711 G.729 G.723 GSM iLBC
Largura de Banda (Kbps) 64 8 5,3 ou 6,3 13 13,3 ou 15
Complexidade (Mips) 0,35 13 19 5 18
Resistência a perda de pacotes ——- 3% 3% 3% 5% ou 7%
MOS 4,41 4,14 3,79 N/A 4,07

 

  • Qualidade de Voz

A qualidade de voz é medida em MOS (Mean Opinion Score, ou média dos resultados das opiniões). Os testes para MOS seguem a norma P.800 da ITU. O MOS varia em uma escala de um (qualidade ruim) a cinco (qualidade excelente);

  • Compensação (ocultação)

Conhecida como ocultação da perda de pacotes (Packet Loss Concealment). Codecs com essa característica conseguem compensar eventuais perdas de pacotes de voz, “ocultando” isso para o usuário final;

  • Silêncio e ruído

Alguns codecs permitem a detecção de silêncio ou intervalo sem presença de voz, fazendo com que esse “vazio” não seja transmitido, economizando banda. Infelizmente o Asterisk  não suporta (ainda) a inclusão desse recurso;

  • Forma de licenciamento

Nem todos os codecs são gratuitos. Alguns como o G.729 e o G.723 necessitam ser licenciados. O custo não é alto: cerca de 10 dólares por canal simultâneo.

Complexidade

A complexidade de um codec é medida em MIPS (milhões de instruções por segundo). Chega a ser difícil comparar a complexidade em MIPS, pois ela é dependente de um processador. Em muitos casos os codecs são processados em DSP’s (Digital Signal Processor), preparados, construídos e até programados para isso, o que alivia a CPU principal do processo de codificação e decodificação. Logo o processamento de codecs pode ser feito tanto por software como por hardware.

Escolhendo o codec

Cada tipo de codec possui uma aplicação diferente, dependente do sistema, ambiente e solução a que ele for implementado. Por isso, saber escolher pode fazer uma grande diferença. Abaixo temos uma análise para cada tipo de rede:

  • Codecs para redes locais

Em redes locais geralmente temos banda passante em abundância, de forma que o nível de compressão tem um peso pequeno na escolha do codec a ser utilizado. Nesse caso uma escolha natural seria o g.711, que ocuparia cerca de 100kbps (incluindo os cabeçalhos) para cada ligação;

  • Codecs para redes WAN

Em uma rede WAN (Wide Area Network), normalmente temos uma banda passante pequena (64, 128 ou 256 Kbps) onde podemos priorizar o tráfego de voz. Nesse tipo de redes, normalmente, é pouco comum ocorrerem perdas de pacotes. Há três bons codecs para esse tipo de rede: o G.729 provavelmente se destaca, pois provê uma excelente qualidade de voz com uma compressão de 8 para 1; o G.723 permite taxas de compressão ainda maiores, mas com certa perda de qualidade; por fim temos o GSM que é uma alternativa para aqueles que procuram custo/benefício. O ponto negativo do GSM fica para o fato de não ter suporte ao codec na maioria dos telefones IP’s e ATA’s.

  • Codecs para Internet

Em uma rede com Internet há dois desafios: banda passante e falta de controle do meio. Por isso temos uma latência alta e jitter (variação da latência), que culminam com a perda de pacotes. Alguns codecs foram desenvolvidos com esses requisitos em mente. O codec mais indicado para esse tipo de rede é o iLBC, que tem uma boa resistência a perda de pacotes e usa pouca banda passante. Mais informações podem ser encontradas na tabela de codecs desse post.

Consumo

A banda usada em codecs é reservada apenas para o que chamamos de payload, ou “carga”, de voz. Para que um pacote de voz possa trafegar pela rede é preciso que ele seja encapsulado usando cabeçalhos de rede. Uma sessão de voz usando o codec G.729 em uma rede Ethernet , por exemplo, consome cerca de 30 Kbps (quase 4 vezes o tamanho do payload!). Para verificar quanto cada codec consome, em qualquer tipo de rede, podemos usar uma calculadora de banda.

Codec no Asterisk

Esse e os dois tópicos abaixo já são mais técnicos. Para selecionar um codec no Asterisk, é preciso editar o canal relativo ao protocolo desejado (IAX, SIP, H323, etc). Dentro de cada canal é possível escolher os codecs para todos os usuários, presente na seção [general], ou individualmente para cada user em [peer/user].  Por exemplo, para selecionar os codecs para todos os usuários, usamos a seção [general]:

[general]
disallow=all
allow=alaw

E individualmente, por [peer/user]:

[40200]
disallow=all
allow=g729

Transcodificação

Em algumas situações o Asterisk precisa converter os pacotes de voz de um codec para o outro.  Esse processo é conhecido como transcodificação e consome muitos recursos de CPU. Sempre que há conversão de pacotes de voz de um codec para o outro, inclusive em leitura e gravação de gravações de dados, ocorre a transcodificação. Se esse processo puder ser evitado pode-se poupar recursos de CPU e evitar a compra de licenças desnecessárias.

Empacotamento do RTP

Na versão 1.4 do Asterisk também é possível alterar os moldes de empacotamento de cada codec. Pode-se agora aumentar ou diminuir o payload de cada codec, por exemplo, usando 60ms ao invés de 20ms, no caso do codec G.729, impactando no consumo de banda. O empacotamento é definido na instrução Allow:

allow=g729:60

Maiores detalhes podem ser encontrados no site da Digium.

Conclusão

A escolha correta do codec faz toda diferença na implementação de uma solução de telefonia IP ou VoIP. Ela influencia, sobretudo, o consumo de banda, número de canais simultâneos e qualidade de voz para o usuário final. Por isso escolha o codec mais correto para o seu tipo de rede, use técnicas de QoS (qualidade de serviço), priorize o tráfego de pacotes de voz e evite as transcodificações.

8 Respostas to “A importância dos Codecs”

  1. Esdraz Lucena Says:

    Qual seria o motivo da utilização da transcodificação? G711 > FXS não transcodifica, mas o GSM > FXS codifica??

  2. Rodrigo Ribeiro Says:

    Caro Esdraz,

    Vou colocar alguns trechos abaixo, retirados de algumas fontes da internet e que vão “clarear” melhor a idéia:

    “Usar a CPU do PC para processar o áudio é condenável!

    O Asterisk usa a CPU do servidor para processar os canais de voz, ao invés de ter um DSP (processador de sinais digitais) dedicado a cada canal. Enquanto isto permitiu que o custo fosse reduzido para as placas E1/T1em até quatro vezes, tornou o sistema, sim, dependente do desempenho da CPU. Com um dimensionamento correto, o Asterisk é capaz de lidar com grandes volumes de chamadas. Recentemente a Digium lançou uma placa chamada TC400B com DSPs para aqueles que desejam processar a voz (transcodificação, cancelamento de eco e dtmf) em processadores de sinais digitais (DSPs) dedicados sem usar a CPU principal do computador. Esta placa possui um custo bastante razoável se comparado com o custo de licenciamento individual do codec G.729 já embutido.

    O papel dos CODECs (COder/DECoder) é codificar a voz em um formato específico para transporte em uma rede digital. Cada tipo de CODEC possui um uso específico. Alguns como o g.729, por exemplo, permitem que se codifique o sinal de áudio à velocidade de 8 kilobits/segundo, uma compressão de 8 para 1 em comparação com a codificação PCM (Pulse Code Modulation) usada na rede pública. Além disso a codificação de voz permite a utilização de diversas outras funcionalidades, como por exemplo:

    * Detecção de voz (VAD)
    * Transmissão de dados descontinua (DTX)
    * Geração de ruído de conforto (CNG)
    * Maior robustez frente a perda de pacotes

    Existem diversos CODECs que o asterisk pode utilizar, sendo que o Asterisk pode fazer a transcodificação de um CODEC para outro de forma transparente. Entretanto alguns CODECs no Asterisk são suportados apenas no modo” pass-through”, em outras palavra, eles não podem ser transcodificados, dado que o Asterisk não entende o stream de bits utilizado pelos mesmos.

    O Asterisk suporta os seguintes CODECs:

    · G.711 ulaw (usado nos EUA) – (64 Kbps);

    · G.711 alaw (usado na Europa e no Brasil) – (64 Kbps);

    · G.723.1 – Modo Pass-through;

    · G.726 – 32kbps no Asterisk 1.0.3, 16/24/32/40kbps;

    · G.729 – Precisa de licença, a menos que esteja usando o modo pass-thru.(8Kbps);

    · GSM – (12-13 Kbps);

    · iLBC – (15 Kbps);

    · LPC10 – (2.5 Kbps);

    · Speex – (2.15-44.2 Kbps).”

    Fonte: http://site.asteriskguide.com/FreeChapters123pt.htm

    Para “aliviar” o uso de CPU da máquina do Asterisk, pelo motivo desta não ter um DSP, existem as placas que fazem esse processo, codificando e transcodificando o áudio. Um exemplo já citado acima é a da TC400B (http://thevoipbox.net/products.php?product=Placa-TC400B-G.729a-Codec-Transcoder).

    Existem também testes de transcodificação para conhecimento público, mostrando a atuação e desempenho de alguns cenários com Asterisk:

    http://www.asteriskexperts.com.br/index.php/arquivo-de-noticias-mainmenu-51/139-1500-chamadas-simultaneas-no-asterisk.html
    http://www.albertosato.voipcenter.com.br/?p=239
    http://clevitonmendes.blogspot.com/2008/06/desempenho-do-asterisk-na-verso-14.html

    Logo é possível afirmar que a transcodificação é o processo no qual o conteúdo de voz compactado ou codificado é transcodificado para ser usado na forma de codec para a rede pública ou outro tipo de codec a ser usado internamente no Asterisk, seja ele propriétário (e tendo licença de uso) ou não. No caso do G711, como ele usa a mesma taxa de codificação (64kb) da rede pública (codec PCM) ele não precisa ser transcodificado, se o caminho for G711 > FXS. No caso do G729 (proprietário), GSM ou outro, que tem taxas de compactação e digitalização diferentes, é preciso haver a transcodificação para que o tipo de áudio venha a ser compatível com o PCM (PSTN).

    Espero que eu tenha sanado a sua dúvida, e para qualquer outra sinta-se a vontade.

  3. Conceitos Básicos de QoS « Templário da Tecnologia Says:

    […] de QoS Junho 7, 2009 — Rodrigo Ribeiro Escrevi um artigo a algum tempo no blog do Ensinar (outro blog onde também faço postagens) que tem relações com o assunto de QoS. No caso era […]

  4. Fernando Meira Lins Says:

    Prezado Rodrigo, sua explicação foi bem elucidativa em vários pontos, mas confesso que mesmo tendo buscado as informações de referência que vc indicou, não conssegui entender aonde está a vantagem ou desvantagem, em aumentar ou diminuir o Empacotamento do RTP

    Ou seja: Acho que entendi muito mal! rsrsrs.

    Passar para allow=g729:60 siginificaria estar triplicando o consumo de banda do CODEC? Qual a vantagem e desvantagem de se fazer isso? Está relacionada mais ao consumo de banda ou à qualidade da voz?

    Grato;
    Fernando

  5. wesleyvolcov Says:

    Caro Fernando,

    O fato de se aumentar a banda utilizada no codec pode influenciar muito na qualidade do audio. Com pacotes maiores temos menos fragmentação, menos perda de dados, porém, será utilizada mais banda para que isso ocorra.
    Balancear boa qualidade de voz e consumo não excessivo de largura de banda, hoje é uma questão muito abrangente. Uma boa opção é utilizar o codec g729, porém há necessidade de licença no caso de transcode.

    Espero ter ajudado.

  6. Fernando Meira Lins Says:

    Agradeço a resposta… Bom, por favor me confirme se meu entendimento explanado abaixo, está correto.

    Então se usarmos por exemplo g729:40, teríamos um pouco mais de “qualidade” com menor possibilidade de perda de pacotes por fragmentação, e consumiríamos o dobro da banda tradicional do codec.

    Seria então um g729 com consumo nominal de 16kb ao invés de 8kb. Na prática sem dúvida a história é outra, mas a “grosso” modo é isso?

  7. Samuel Says:

    Caro sou praticamente um leigo neste assunto e gostaria de saber qual o melhor codec para utilizar com o Csipsimple e Vono num Galaxy 5, GSM ou ILBC ou posso deixar ambos?

  8. Messias Galvão Says:

    Derrepente alguém possa me ajudar..Estou desenvolvenso um software de decodificação de tons de DTMF pelo telefone, para isso uso um FAX MODEM VOICE e comandos ATs (comandos de modem). O software funciona quase bem, atende a ligação entra no mode voice recebe os tons decodifica, o problema é que se esses tons vierem muito rápido o modem não da conta de decodificar os pacotes por inteiro começa a quebrar números, e ainda certos modems recebe caracteres truncados tipo: 1~/3~/6~/7~/9, ao invez de : 1 2 3 4 5 6 7 8 9.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s


%d blogueiros gostam disto: