Utilizzare rtpengine come transcoder in scenari SIP con Kamailio
Curiosando tra i miei post precedenti avrete avuto modo di scoprire le potenzialità di rtpengine, dalla procedura di installazione alla configurazione per utilizzarlo con kamailio. Qui andremo ad approfondire ulteriormente le funzionalità di rtpengine e lo utilizzeremo come transcoder audio, cioè per adattare gli stream audio generati da due endpoint RTP che utilizzano codec audio diversi.
Per il mio scenario di test utilizzerò come sorgente un client che propone come codec nell’ordine PCMU, GSM, G729 e OPUS mentre la destinazione supporta il solo PCMA. Tra i 2 endpoint a gestire sia il traffico SIP che l’audio RTP c’è Kamailio configurato con rtpengine a fare da transcoder, che nel caso specifico effettua la transcodifica tra PCMU e PCMA.
rtpengine all’opera
Come prima cosa possiamo controllare quali sono i codec supportati da rtpengine utilizzando il comando rtpengine --codecs
.
# rtpengine --codecs
PCMA: fully supported
PCMU: fully supported
G723: fully supported
G722: fully supported
QCELP: supported for decoding only
G729: fully supported
G729a: fully supported
speex: fully supported
GSM: fully supported
iLBC: not supported
opus: fully supported
vorbis: codec supported but lacks RTP definition
ac3: codec supported but lacks RTP definition
eac3: codec supported but lacks RTP definition
ATRAC3: supported for decoding only
ATRAC-X: supported for decoding only
EVRC: supported for decoding only
EVRC0: supported for decoding only
EVRC1: supported for decoding only
AMR: fully supported
AMR-WB: fully supported
telephone-event: fully supported
CN: fully supported
PCM-S16LE: codec supported but lacks RTP definition
PCM-U8: codec supported but lacks RTP definition
MP3: codec supported but lacks RTP definition
Dopo aver controllato che i codec di cui abbiamo bisogno sono supportati, non dobbiamo fare altro che modificare la configurazione di Kamailio per attivare rtpengine con le funzionalità di transcodifica. In particolare la chiamata alla funzione rtpengine_manage() dovrà contenere tra i parametri quelli specifici per attivare il transcoding.
if (has_body("application/sdp")) {
rtpengine_manage("codec-mask-all codec-transcode-PCMA codec-transcode-telephone-event");
}
In questo caso stiamo dicendo al sistema che alla ricezione di una chiamata (SIP INVITE) contenente l’SDP nel body, il controllo dei media deve essere passato a rtpengine che utilizzerà i codec PCMA e telephone-event sul leg di destinazione, e negozierà uno tra quelli proposti nel SDP sul leg di ingresso.