Используем кодек G729 в asterisk.

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

Используем кодек G729 в asterisk.: 4 комментария

  1. Віктор

    «уменьшаются до 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 якість майже така ж але нагрузка на сервер та процесор буде меншою.

  2. skeletor Автор записи

    Вы правы, сейчас исправлю.
    От себя хочу добавить такую информацию: в действительности 8-кбит/с это скорость кодирования, а не полоса пропускания. Для расчёта полосы пропускания можно воспользоваться Bandwidth Calculator

  3. Saenara


    Как вариант, можно в настройках пира либо прописать dtmfmode=info/auto, либо вообще заккоментировать dtmfmode

    А использовать
    dtmfmode = rfc2833
    религия не позволяет?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *