asterisk 语音编码转换
asterisk作为VoIP系统,其一大特性是对RTP媒体流的处理能力,由于开源解码器的存在,以及可以运行在价格低廉的X86硬件系统上,经常被用于完成不同系统间的语音编码转换,以取代价格相对昂贵的硬件设备。
常见的编码转换场景例如 局域网内使用ulaw,alaw或者g722编码,外呼时使用g729编码以节省带宽
asterisk 中支持的语音编码
查看 asterisk 支持的编码格式命令为
core show translation
图中看到的数字表示两种编码转换所需要的时间,数值越小,则表示转码速度越快,-表示不支持此种编码转换
使用 module load codec_ tab键 可以查看/加载系统支持的语音编码
astercc_us*CLI> module load codec_<tab> codec_a_mu.so codec_adpcm.so codec_alaw.so codec_dahdi.so codec_g722.so codec_g726.so codec_gsm.so codec_lpc10.so codec_ulaw.so codec_g729-ast16-icc-glibc-x86_64-pentium4.so
加载和卸载 asterisk 模块的命令分别为 module load .so 以及 module load .so,例如
astercc_us*CLI> module unload codec_g729-ast16-icc-glibc-x86_64-pentium4.so Unloaded codec_g729-ast16-icc-glibc-x86_64-pentium4.so == Unregistered translator 'lintog729' from format slin to g729 == Unregistered translator 'g729tolin' from format g729 to slin astercc_us*CLI> module load codec_g729-ast16-icc-glibc-x86_64-pentium4.so Loaded codec_g729-ast16-icc-glibc-x86_64-pentium4.so == Registered translator 'g729tolin' from format g729 to slin, cost 1000 == Registered translator 'lintog729' from format slin to g729, cost 5999 Loaded codec_g729-ast16-icc-glibc-x86_64-pentium4.so => (g729 Coder/Decoder, based on IPP)
http://asterisk.hosting.lv/ 上可以下载针对不同 asterisk 版本和CPU编译的 g729 g723 so文件, cpu类型可以通过以下命令查看
cat /proc/cpuinfo
文件需要下载到相应的 asterisk 库目录, 一般为 /usr/lib/asterisk/modules 或者 /usr/lib64/asterisk/modules
在 asterisk 系统中,当需要连接的两个终端使用的编码没有交集而asterisk又支持这两种编码的转换,这时 asterisk 就会进行编码转换。
使用 sip show peer 名称 命令,可以查看该系统中为该终端设定的编码及顺序
astercc_us*CLI> sip show peer astercc-5000 .... Defaddr->IP : 0.0.0.0 Port 5060 Prim.Transp. : UDP Allowed.Trsp : UDP Def. Username: SIP Options : (none) Codecs : 0x28010e (gsm|ulaw|alaw|g729|h263|h264) Codec Order : (ulaw:20,alaw:20,gsm:20,g729:20) Auto-Framing : No 100 on REG : No ....
修改编码可以通过修改 sip 配置文件实现,例如我们改为仅支持729编码
[astercc-5000] callerid=5000 <5000> accountcode=1235430313 secret=temp321 callgroup=1 pickupgroup=1 language=cn type=friend qualify=yes port=5060 nat=yes host=dynamic dtmfmode=rfc2833 context=hosted-dialout directmedia=no call-limit=1 disallow=all allow=g729
保存,重载 asterisk sip配置
astercc_us*CLI> sip reload Reloading SIP == Parsing '/etc/asterisk/sip.conf': == Found == Parsing '/etc/asterisk/sip_general_astercc.conf': == Found == Parsing '/etc/asterisk/sip_hostedpbx_registrations.conf': == Found == Parsing '/etc/asterisk/sip_custom.conf': == Found == Parsing '/etc/asterisk/sip_hostedpbx_devices.conf': == Found == Parsing '/etc/asterisk/sip_hostedpbx_trunks.conf': == Found == Parsing '/etc/asterisk/users.conf': == Found == Using SIP TOS bits 96 == Using SIP CoS mark 4 == Parsing '/etc/asterisk/sip_notify.conf': == Found
再次查看 会发现该终端的编码已经改变
astercc_us*CLI> sip show peer astercc-5000 .... Defaddr->IP : 0.0.0.0 Port 5060 Prim.Transp. : UDP Allowed.Trsp : UDP Def. Username: SIP Options : (none) Codecs : 0x100 (g729) Codec Order : (g729:20) Auto-Framing : No 100 on REG : No ....
