Configurando o CODEC Opus para Asterisk® SCF™

 

Devido o crescente movimento de uso do WebRTC, a utilização do CODEC Opus para Asterisk® SCF™ se faz necessário e, expõe algumas opções de configuração que permitem manipular o codificador para sua configuração específica. Essas opções podem ser definidas em codecs.conf. Eles são úteis para personalizar um tipo de formato que pode então ser especificado na linha “allow” de um terminal. O codificador usa todas as opções a seguir, direta ou indiretamente. Algumas das opções especificam parâmetros de formato no SDP, mas também influenciam a codificação. Outras opções oferecem dicas ao codificador sobre que tipo de dados processar ou em que tipo de modo operar. A maioria, se não todas as opções, oferece um compromisso entre qualidade e eficiência, por isso é bom saber o que cada uma faz antes de mudar. um valor. As seguintes opções podem ser configuradas no  Asterisk® SCF™:
 

CBR

Quando definido como “yes”, o codificador usa uma taxa de bits constante em oposição a uma taxa de bits variável. Uma taxa de bits variável geralmente é melhor, pois ajusta a taxa automaticamente, permitindo áudio de qualidade potencialmente mais alta em taxas mais baixas. Por causa disso, você normalmente desejará deixar esse valor definido como “no”, que é o padrão. No entanto, alguns dispositivos e configurações podem exigir taxas de bits constantes
 
Definir este valor como “yes” também define o parâmetro “cbr” igual a “1” no SDP.

BITRATE

A especificação deste valor define um limite aproximado de taxa de bits no codificador. Os seguintes valores são permitidos: 
  • auto – permite que o codificador controle a taxa de bits. Este é o padrão
  • max – O codificador usa a quantidade máxima que pode. 500 - 512000 – Qualquer valor entre e incluindo esses dois números. Quando designado, este valor também define o parâmetro “maxaveragebitrate” no SDP
Embora não seja o único fator, a taxa de bits afeta diretamente a qualidade do áudio. Diminuir a taxa de bits diminui a qualidade do áudio, enquanto aumentá-la aumenta a qualidade. Dito isto, o áudio contendo apenas fala geralmente pode ser codificado em uma taxa de bits muito mais baixa do que o áudio contendo música, sem uma degradação perceptível na qualidade. 
 
Dependendo do(s) tipo(s) de endpoint(s) que você está usando, esta opção pode precisar ser definida para que o codificador codifique o áudio em uma taxa de bits que possa ser manipulada pelo endpoint. Por exemplo, se um endpoint só puder lidar com uma taxa de bits média máxima de 16.000, então isso precisará ser definido como 16.000 ou menos, para atuar com sistema de WebPhones, a taxa de bits média máxima de 8.000 é perfeita.

DTX

Se “yes”, então a transmissão descontínua está habilitada. Isto significa que o codificador tentará reduzir a taxa de bits quando o silêncio for detectado. Quando definido, também define o parâmetro “usedtx” igual a “1” no SDP. O valor padrão para “dtx” é “no”.

MAX_PLAYBACK_RATE

Isso define o parâmetro “maxplaybackrate” do SDP e também limita a largura de banda no codificador. Qualquer valor igual ou entre 8.000 e 48.000 é permitido. O seguinte mostra um mapeamento de larguras de banda com base em um valor especificado: 
 
8000Banda Estreita
8001 – 16000Banda Média
16001 – 24000Banda Larga
24001 – 32000Banda Super Larga
32001 – 48000Banda Completa
Está opção tem um valor padrão de 48.000, o que é óbvio não é o recomendado para nossas soluções no Brasil. O recomendado é de 8.000.

PACKET_LOSS

Isso estipula a porcentagem esperada de perda de pacotes (0 a 100) no codificador. O Opus tem alguns truques na manga quando se trata de perda de pacotes, como correção de erros de encaminhamento em banda (FEC). Falaremos um pouco mais sobre FEC posteriormente, mas para que o codificador inclua os dados FEC, esta opção precisa ser definida com um valor apropriado.
  Aumentar a porcentagem significa melhor proteção contra perdas. No entanto, deve-se ressaltar que o ajuste deste valor pode afetar a qualidade. Para manter a taxa média de bits e ao mesmo tempo incluir informações de perda de pacotes, o Opus pode diminuir a taxa do áudio atual que está sendo codificado. A configuração padrão para isso é ZERO. Se você estiver tendo problemas de áudio devido à perda de pacotes, tente ajustar esse valor para ver se isso ajuda.

APPLICATION

Isso dá uma dica sobre que tipo de dados serão codificados, para que os dados possam ser codificados da maneira mais eficiente possível no que diz respeito ao uso. Os seguintes valores são permitidos:
  • voip – O codificador espera voz ou dados de fala. Esta é a configuração padrão. 
  • audio – O codificador não faz nenhuma suposição especial sobre os dados.
  • low_delay – Os dados são codificados com o menor atraso de codificação possível.

SIGNAL

Semelhante à configuração de “aplicativo”, isso também oferece uma dica ao codificador sobre que tipo de dados está sendo codificado e seleciona o tipo de modo que o codificador prefere. Os seguintes valores são permitidos:
  • auto – permite que o codificador escolha. Esta é a configuração padrão. 
  • voice – O codificador prefere operar em modos mais propícios aos dados de fala.
  • music – O codificador tende a operar em um modo mais aceitável para outro áudio.

COMPLEXITY

A complexidade computacional do Opus pode variar dependendo de vários fatores. Normalmente, quanto maior a qualidade de áudio para a qual o codec está configurado, maior a complexidade e, portanto, potencialmente maior a utilização da CPU. Isto pode ser um pouco mitigado por outras configurações, por exemplo, a codificação de voz é menos complexa que a música. A modificação da configuração de complexidade afeta diretamente a utilização da CPU.  
Os valores permitidos variam de 0 (zero) a 10. Um valor zero representa quantidades menores de tempo de CPU usado, enquanto um valor de dez é o maior tempo concedido.

FEC

Quando definido como “yes”, isso informa ao codificador para adicionar dados de correção de erro direto (Forward Error Correction - FEC) em banda aos quadros Opus codificados. Os quadros contendo informações FEC permitem que os decodificadores reconstruam um quadro anteriormente perdido. Definir este valor não significa que o codificador adiciona FEC automaticamente aos quadros de saída. Outras condições também devem ser atendidas no codificador antes que ele adicione as informações. Por exemplo, deve estar operando no modo correto. Além disso, ajustar a porcentagem de “packet_loss” para um valor esperado apropriado deve acionar a adição de FEC assim que o limite de perda interna for atingido.  
Definir este valor como “yes” também define o parâmetro “useinbandfec” igual a “1” no SDP. Esta opção tem como padrão o valor “no”.

O que mais ?

Atualmente, todas essas opções de configuração são suportadas. Há também uma página wiki que lista todas as opções mais recentes junto com alguns exemplos. Não deixe de conferir! Se ou quando novas configurações forem disponibilizadas, essa página será atualizada.
 
 
Devido, alterações sobre o sistema operacional CentOS, e uma vez que ainda não estamos bem a vontade com o Rock Linux, aqui vai o procedimento para o Debian 10 e 11.
 
E pensando que esteja utilizando o Asterisk 13.35.0:
 
apt-get install -y libopus-dev opus-tools
 
cd /opt/
wget http://downloads.digium.com/pub/telephony/codec_opus/asterisk-13.0/x86-64/codec_opus-13.0_current-x86_64.tar.gz 
tar -zxvf codec_opus-13.0_current-x86_64.tar.gz 
rm -rf codec_opus-13.0_current-x86_64.tar.gz
cp -av codec_opus-13.0_1.3.0-x86_64/*.so /usr/lib/asterisk/modules/
cp -av codec_opus-13.0_1.3.0-x86_64/*.xml /var/lib/asterisk/documentation/thirdparty/ 
 vim /etc/asterisk/modules.conf
load = codec_opus
load = res_format_attr_opus.so
load = res_crypto
load = res_http_websocket
load = res_pjsip_transport_websocket
load = res_srtp
load = format_ogg_opus.so
vim /etc/asterisk/rtp.conf
[general]
rtpstart=10000 ;; ajuste para sua realidade
rtpend=10099 ;; ajuste para sua realidade
rtpchecksums=no
dtmftimeout=3000
rtcpinterval=5000
strictrtp=yes
probation=4
srtpreplayprotection=yes
icesupport=yes ;; importante
strictrtp=no ;; importante
stunaddr=stun.l.google.com:19302 ;; importante
stun_software_attribute=yes
dtls_mtu=1200
vim codecs.conf
[speex]
quality => 3
complexity => 2
enhancement => true
vad => true
vbr => true
abr => 0
vbr_quality => 4
dtx => false
preprocess => false
pp_vad => false
pp_agc => false
pp_agc_level => 8000
pp_denoise => false
pp_dereverb => false
pp_dereverb_decay => 0.4
pp_dereverb_level => 0.3

[plc]
genericplc => true
genericplc_on_equal_codecs => false

[silk8]
type=silk
samprate=8000
fec=true
packetloss_percentage=10
maxbitrate=10000

[silk12]
type=silk
samprate=12000
maxbitrate=12000
fec=true
packetloss_percentage=10;

[silk16]
type=silk
samprate=16000
maxbitrate=20000
fec=true
packetloss_percentage=10;

[silk24]
type=silk
samprate=24000
maxbitrate=30000
fec=true
packetloss_percentage=10;


[opus]
type=opus
packet_loss=5
complexity=10
max_bandwidth=narrow
signal=auto
application=voip
max_playback_rate=8000
bitrate=auto
cbr=1
fec=1
dtx=0
vim /etc/asterisk/sip.conf
[general]
callcounter=yes ; Habilita estado dos endpoints SIP.
rtcachefriends=yes
udpbindaddr=0.0.0.0:5060
disallow=all
allow=opus
allow=ulaw
allow=alaw
allow=gsm
rasterisk -vvvvgci
*CLI> module show like opus
Module Description Use Count Status Support Level
codec_opus.so OPUS Coder/Decoder 0 Running extended
format_ogg_opus.so OGG/Opus audio 0 Running core
res_format_attr_opus.so Opus Format Attribute Module 1 Running core
3 modules loaded
*CLI>
*CLI> core show translation paths opus 
--- Translation paths SRC Codec "opus" sample rate 48000 ---
opus:48000 To codec2:8000 : No Translation Path
opus:48000 To g723:8000 : No Translation Path
opus:48000 To ulaw:8000 : (opus@48000)->(slin@48000)->(slin@8000)->(ulaw@8000)
opus:48000 To alaw:8000 : No Translation Path
opus:48000 To gsm:8000 : (opus@48000)->(slin@48000)->(slin@8000)->(gsm@8000)
opus:48000 To g726:8000 : No Translation Path
opus:48000 To g726aal2:8000 : No Translation Path
opus:48000 To adpcm:8000 : No Translation Path
opus:48000 To slin:8000 : (opus@48000)->(slin@48000)->(slin@8000)
opus:48000 To slin:12000 : (opus@48000)->(slin@48000)->(slin@12000)
opus:48000 To slin:16000 : (opus@48000)->(slin@48000)->(slin@16000)
opus:48000 To slin:24000 : (opus@48000)->(slin@48000)->(slin@24000)
opus:48000 To slin:32000 : (opus@48000)->(slin@48000)->(slin@32000)
opus:48000 To slin:44100 : (opus@48000)->(slin@48000)->(slin@44100)
opus:48000 To slin:48000 : (opus@48000)->(slin@48000)
opus:48000 To slin:96000 : (opus@48000)->(slin@48000)->(slin@96000)
opus:48000 To slin:192000 : (opus@48000)->(slin@48000)->(slin@192000)
opus:48000 To lpc10:8000 : No Translation Path
opus:48000 To g729:8000 : No Translation Path
opus:48000 To speex:8000 : No Translation Path
opus:48000 To speex:16000 : No Translation Path
opus:48000 To speex:32000 : No Translation Path
opus:48000 To ilbc:8000 : No Translation Path
opus:48000 To g722:16000 : (opus@48000)->(slin@48000)->(slin@16000)->(g722@16000)
opus:48000 To siren7:16000 : No Translation Path
opus:48000 To siren14:32000 : No Translation Path
opus:48000 To testlaw:8000 : (opus@48000)->(slin@48000)->(slin@8000)->(testlaw@8000)
opus:48000 To g719:48000 : No Translation Path
opus:48000 To none:8000 : No Translation Path
opus:48000 To silk:8000 : No Translation Path
opus:48000 To silk:12000 : No Translation Path
opus:48000 To silk:16000 : No Translation Path
opus:48000 To silk:24000 : No Translation Path
*CLI>
 
 
Um ponto muito importante é que você deve utilizar o CODEC Opus de acordo com sua versão, e existe incompatibilidade de versão entre servidores Asterisk, fique atento. 

Qualquer dúvida, estou a disposição no e-mail professor.delphini#outlook.com. Não acredite que vou responder de pronto, mas vou responder, e caso tenha pressa, pode me encontrar na comunidade oficial da Fundação Asterisk Libre no Telegram, segue o convite: https://t.me/asterisk_br 

Uma vez na comunidade, pode questionar, pois tem na mesma uma gama muito grande de profissionais sempre com o espírito de liberdade!
 
Recomendo que veja:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Nenhum comentário

Toda vez que um homem supera os reveses, torna-se mentalmente e espiritualmente mais forte!

Tecnologia do Blogger.