1) Введение.
Кодек G.729 – это стандартизированный продукт, который позволяет вести большое количество телефонных разговоров в ограниченной полосе пропускания, что делает использование VoIP еще более эффективным и экономичным. Обычный звонок требует 64Кбит/с полосы пропускани. С использованием кодека G.729 требования для одного звонка уменьшаются до 8Кбит/с.
Примечание.
В действительности 8-кбит/с это скорость кодирования, а не полоса пропускания. Для расчёта полосы пропускания можно воспользоваться Bandwidth Calculator
Большинство людей отдают предпочтение Asterisk с применением кодека G.729 для замены дорогостоящих шлюзов. В настоящее время Asterisk поддерживает только кодек G.729 Annex A, хотя есть ещё 729b.
Относительно производительности системы: все преобразования кодека G.729 происходят в программном обеспечении, поэтому требуется тщательно взвесить все за и против, когда вы собираете сервер для работы с Asterisk. Тесты компании Digium показывают, что сервер на базе процессора Intel® Xeon 1.8GHz поддерживает до 60 одновременных звонков с использованием кодека G.729. Процессор Dual Xeon 2.8GHz поддерживает до 80 одновременных звонков с G.729.
Кодек G.729 работает со всеми интерфейсными платами Digium и с любыми процессорами.
Напомню, что по умолчанию asterisk использует кодек G711.
Перед использованием настоятельно рекомендую прочесть о лицензии на этот кодек http://www.voip-info.org/wiki/view/Asterisk+G.729+Licensing
Всё нижеописанное проводилось на стенде:
FreeBSD 7.0-RELEASE, Asterisk 1.4.24.1
2) Просмотр информации о кодеках
asterserver*CLI> show codecs
Disclaimer: this command is for informational purposes only.
It does not indicate anything about your configuration.
INT BINARY HEX TYPE NAME DESC
--------------------------------------------------------------------------------
1 (1 << 0) (0x1) audio g723 (G.723.1)
2 (1 << 1) (0x2) audio gsm (GSM)
4 (1 << 2) (0x4) audio ulaw (G.711 u-law)
8 (1 << 3) (0x8) audio alaw (G.711 A-law)
16 (1 << 4) (0x10) audio g726aal2 (G.726 AAL2)
32 (1 << 5) (0x20) audio adpcm (ADPCM)
64 (1 << 6) (0x40) audio slin (16 bit Signed Linear PCM)
128 (1 << 7) (0x80) audio lpc10 (LPC10)
256 (1 << 8) (0x100) audio g729 (G.729A)
512 (1 << 9) (0x200) audio speex (SpeeX)
1024 (1 << 10) (0x400) audio ilbc (iLBC)
2048 (1 << 11) (0x800) audio g726 (G.726 RFC3551)
4096 (1 << 12) (0x1000) audio g722 (G722)
65536 (1 << 16) (0x10000) image jpeg (JPEG image)
131072 (1 << 17) (0x20000) image png (PNG image)
262144 (1 << 18) (0x40000) video h261 (H.261 Video)
524288 (1 << 19) (0x80000) video h263 (H.263 Video)
1048576 (1 << 20) (0x100000) video h263p (H.263+ Video)
2097152 (1 << 21) (0x200000) video h264 (H.264 Video)
А теперь посмотрим, установлен ли кодек:
asterserver*CLI> core show translation
Translation times between formats (in milliseconds) for one second of data
Source Format (Rows) Destination Format (Columns)
g723 gsm ulaw alaw g726aal2 adpcm slin lpc10 g729 speex ilbc g726 g722
g723 - - - - - - - - - - - - -
gsm - - 2 2 2 2 1 2 - 14 12 2 -
ulaw - 2 - 1 2 2 1 2 - 14 12 2 -
alaw - 2 1 - 2 2 1 2 - 14 12 2 -
g726aal2 - 2 2 2 - 2 1 2 - 14 12 1 -
adpcm - 2 2 2 2 - 1 2 - 14 12 2 -
slin - 1 1 1 1 1 - 1 - 13 11 1 -
lpc10 - 2 2 2 2 2 1 - - 14 12 2 -
g729 - - - - - - - - - - - - -
speex - 3 3 3 3 3 2 3 - - 13 3 -
ilbc - 12 12 12 12 12 11 12 - 24 - 12 -
g726 - 2 2 2 1 2 1 2 - 14 12 - -
g722 - - - - - - - - - - - - -
минусы напротив кодека значат, что не установлен.
А можно просто глянуть на наличие файла codec_g729.so в библиотеке с модулями (по умолчанию это либо /usr/lib/asterisk/modules, /usr/local/lib/asterisk/modules, /var/lib/asterisk/modules).
Команда ‘show modules like 729’ покажет, подгружен ли модуль:
asterserver*CLI> show modules like 729
Module Description Use Count
format_g729.so Raw G729 data 0
1 modules loaded
3) Установка кодека.
Если кодек не установлен, то его можно скачать отсюда http://asterisk.hosting.lv/ или отсюда http://asterisk.ru/codecs (хотя на нём содержаться ссылки на первый сайт) . Выбираем свою ОС и соответствующий кодек. Переименовуем его в codec_g729.so и кладём в папку с модулями. После этого можно попробовать подгрузить модуль:
asterserver*CLI> module load codec_g729.so
При этом в debug-режиме появится сообщение:
== Registered translator 'g729tolin' from format g729 to slin, cost 1
== Registered translator 'lintog729' from format slin to g729, cost 4
Loaded codec_g729.so => (g729 Coder/Decoder, based on IPP)
Проверяем:
asterserver*CLI> show modules like 729
Module Description Use Count
format_g729.so Raw G729 data 0
codec_g729.so g729 Coder/Decoder, based on IPP 5
2 modules loaded
asterserver*CLI> core show translation
Translation times between formats (in milliseconds) for one second of data
Source Format (Rows) Destination Format (Columns)
g723 gsm ulaw alaw g726aal2 adpcm slin lpc10 g729 speex ilbc g726 g722
g723 - - - - - - - - - - - - -
gsm - - 2 2 2 2 1 2 5 14 12 2 -
ulaw - 2 - 1 2 2 1 2 5 14 12 2 -
alaw - 2 1 - 2 2 1 2 5 14 12 2 -
g726aal2 - 2 2 2 - 2 1 2 5 14 12 1 -
adpcm - 2 2 2 2 - 1 2 5 14 12 2 -
slin - 1 1 1 1 1 - 1 4 13 11 1 -
lpc10 - 2 2 2 2 2 1 - 5 14 12 2 -
g729 - 2 2 2 2 2 1 2 - 14 12 2 -
speex - 3 3 3 3 3 2 3 6 - 13 3 -
ilbc - 12 12 12 12 12 11 12 15 24 - 12 -
g726 - 2 2 2 1 2 1 2 5 14 12 - -
g722 - - - - - - - - - - - - -
Видим, что кодек успешно подгрузился. Что бы при каждой перезагрузке asterisk’a модуль подгружался автоматом, добавляем такую строчку в файл modules.conf (добавляем в том случае, если в этом же файле стоит autoload=no, иначе – можно не добавлять)
load => codec_g729.so
4) Использование кодека.
Для того, что бы определённый peer мог использовать этот кодек, нужно его добавить в разрешающие в настройках sip-аккаунта в файле sip.conf (можно так же добавить и в секцию [general] ):
[1111]
type=peer
host=x.x.x.x
port=5060
disallow=all
allow=g729
allow=gsm
allow=ulaw
allow=alaw
Этими настройками мы установили доступные для использования кодеки и их приоритеты: выше, значит первый. Эту же информацию можна получить и через команду (привожу не весь вывод команды, а только ту часть, которая касается кодеков)
asterserver*CLI> sip show peer 1111
...
Codecs : 0x10e (gsm|ulaw|alaw|g729)
Codec Order : (g729|gsm|ulaw|alaw)
...
После этого перечитываем конфиг sip.conf и пробуем звонить. Для того, что бы удостовериться, что кодек действительно работает, можно, например, разрешить пиру использовать только его.
Так же можно проверять и во время звонка, какой кодеки достуны для использования:
asterserver*CLI> sip show channels
Peer User/ANR Call ID Seq (Tx/Rx) Format Hold Last Message
10.0.52.16 75206 001bd4a0-35 00101/00102 (None) No Rx: ACK
XX.XX.XX.XX 3809569429 20abc7a85b2 00102/00000 (g729) No Init: INVITE
10.0.52.17 75207 001bd47d-54 00101/00102 (ulaw|alaw) No Rx: INVITE
XX.XX.XX.XX 3803548215 2baa3656262 00102/00000 (g729) No Tx: ACK
10.0.52.12 75203 002155d5-6c 00101/00102 (ulaw|alaw) No Rx: ACK
XX.XX.XX.XX 3803126694 0f7a8fe514a 00102/00000 (g729) No Tx: ACK
10.0.52.11 75202 001e4af2-a9 00101/00102 (ulaw|alaw) No Rx: ACK
7 active SIP channels
5) Возможные проблемы.
– No compatible codecs, not accepting this offer!
Значит, что используемый кодек не подключён/не установлен/неработоспособен/… Проверьте все ли кодеки загружены.
– Inband DTMF is not supported on codec g729. Use RFC2833
Как вариант, можно в настройках пира либо прописать dtmfmode=info/auto, либо вообще заккоментировать dtmfmode. Некоторые пишут, что им помогла опция rfc2833compensate=yes в файле sip_general_custom.conf
– Illegal instruction (core dumped)
Значит, что кодек собран не для вашей ОС или процессора.
– codec_g729a.so cannot restore segment prot after reloc: Permission denied
Вариант решения описан здесь http://romik-g.livejournal.com/82910.html
6) Дополнения.
Если у вас нет аппарата с поддержкой кодека g729, то можно воспользоваться бесплатным softphone Firefly (под windows) со специальной сборкой http://www.asteriskforum.ru/files/Firefly.1.9.9.4521-g729.exe. Под linux можно использовать Ekiga 3.0 и выше. Остальные softphon’ы платные.
Теперь пару слов о поддержке этого кодека аппаратами cisco 7911. Мне так и не удалось заставить его работать с этим кодеком, хотя в прошивке его явно указано использовать этот кодек:
<preferredCodec>g729a</preferredCodec>
Видимо это баг, но информации об этом вообще нет.
Поделюсь полезной ссылкой http://www.bandcalc.com/, которая представляет собой калькулятор кодеков: какой за сколько времени и с какими параметрами в какой перекодируется.
Если у вас древняя ОС, например, FreeBSD 4.*/5.*, то рекомендации по установке кодека можно почерпнуть здесь http://asteriskforum.ru/viewtopic.php?t=265
Опубликовано с разрешения журнала root.ua
4 коментарі “Используем кодек G729 в asterisk.”
“уменьшаются до 8Кбит/с (с учетом заголовка IP-пакета). ”
🙂 ось тут і помилочка вийшла.
в параметрах кодеків вказується лише скільки даних він передасть за секунду без врахування IP пакета + UDP + RDP + Ethernet(Frame).
ось що получиться в реальності, якщо використовувати кодек G.729:
1) якщо взяти 20 мілісекунд голосу в одному пакеті цього кодека, то получиться 20 байт в пакеті.
2) 20 байт IP пакет (це мінімум, максимум 60)
3) 8 байт для UDP
4) 12 байт для RTP
5) 18 байт для Ethernet
получиться щось біля 30.5 кбіт/с з таким кодеком, аж ніяк не 8 кбіт/с.
якщо взяти G.711u/a то в реальності не 64кбіт/с, а около 96-110 кбіт/с.
І використовуйте G.729a якість майже така ж але нагрузка на сервер та процесор буде меншою.
Вы правы, сейчас исправлю.
От себя хочу добавить такую информацию: в действительности 8-кбит/с это скорость кодирования, а не полоса пропускания. Для расчёта полосы пропускания можно воспользоваться Bandwidth Calculator
—
Как вариант, можно в настройках пира либо прописать dtmfmode=info/auto, либо вообще заккоментировать dtmfmode
—
А использовать
dtmfmode = rfc2833
религия не позволяет?
Позволяет 🙂 , просто так написал.