前言
G.729 编码在 VOIP 通话中有着低带宽,高效压缩优点,只有8kbps,但 FreeSWITCH 自带的 mod_bcg729 模块是收费的,不过在2017.1.1已经可以免费使用了(As of Jan 1 2017, G.729 is a royalty free codec: http://www.sipro.com/G729.html)
带宽&网速
以下摘自网上
带宽”与“网速”本身没有区别,只不是它们以不同的单位给用户呈现数据罢了。简单来说,“带宽”使用的单位是bit(位),“网速”使用的单位是Byte(字节),而这两者之间的关系是1Byte=8bit。
所谓 1M 宽带,其实是指 1Mbps (兆比特每秒),亦即 1 x 1024 / 8 = 128KB/sec,但这只是理论上的速度,实际上则要再扣约 12% 的信息头标识等各种控制讯号,故其传输速度上限应为 112KB/sec 左右。Mbps实际上是一个带宽单位,而非速度单位,在“Mbps”单位中的“b”是指“Bit(位)”。而真正的速度单位应为MB/s,其中的“B”是指“Byte(字节)”。因为数据是按字节传输的,而并非按位。
就因这两个大、小写不同的“B”和“b”,使得这两个单位不仅不能等同,而且相差甚远。当然它们之间也存在着较大关联的,那就是1MB/s=8Mbps,可以这么理解,那就是端口速率是端口的理论最大传输速度,实际中的速度要远小于带宽值(通常为60~80%之间)。
PCMA/PCMU & G729 带宽占用计算
网上有个版本 Ethernet 头长度写错了,笔者不知道208bit是怎么计算来的,实际 Ethernet 头是6+6+2=14byte 14*8=112bit。
计算方法
带宽
=包长度×每秒包数
=包长度×(1/打包周期)
=(Ethernet头+IP头+UDP头+RTP头+有效载荷)×(1/打包周期)
=(112bit+160bit+64bit+96bit +有效载荷)×(1/打包周期)
=(432bit+(打包周期(秒)×每秒的比特数))×(1/打包周期)
=(432/打包周期)+ 每秒比特数
计算公式
G711:20ms打包,带宽为 (432/20+64) Kbps=85.6Kbps
G729:20ms打包,带宽为 (432/20+8) Kbps=29.6Kbps
1~1000路并发所占带宽,如果是 FreeSWITCH 桥接2路,需要现有带宽double
编码/带宽 | 1 | 100 | 1000 | 10000 |
G729 | 29.6Kbps | 2.96Mbps | 29.6Mbps | 296Mbps |
PCMA/PCMU | 85.6Kbps | 8.56Mbps | 85.6Mbps | 856Mbps |
安装
假设已经安装好 FreeSWITCH,没有装好的可以看下之前的安装教程:https://gqwm.com/posts/install-freeswitch-on-debian/
apt-get -y install libfreeswitch-dev git autoconf automake libtool
cd /usr/src/
git clone https://github.com/xadhoom/mod_bcg729.git
cd mod_bcg729
make && make install
make 如果报错需要改一下 Makefile
FS_INCLUDES=/usr/include/freeswitch
FS_MODULES=/usr/local/freeswitch/mod
编译完需要重启下 FreeSWITCH
systemctl restart freeswitch
检查编码是否生效,结果返回就对了。
fs_cli -x "show codecs" b | grep g729`
Result: codec,G.729,mod_bcg729