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.

rtpengine-transcoding