Asterisk проблема с кодеками

Обновлено: 02.07.2024

Примечание.

Большинство людей отдают предпочтение 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.

Всё нижеописанное проводилось на стенде:

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).

asterserver*CLI> show modules like 729
Module Description Use Count
format_g729.so Raw G729 data 0
1 modules loaded

3) Установка кодека.

asterserver*CLI> module load codec_g729.so

== 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 - - - - - - - - - - - - -

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) Возможные проблемы.

Как вариант, можно в настройках пира либо прописать dtmfmode=info/auto, либо вообще заккоментировать dtmfmode. Некоторые пишут, что им помогла опция rfc2833compensate=yes в файле sip_general_custom.conf

Значит, что кодек собран не для вашей ОС или процессора.

6) Дополнения.

Теперь пару слов о поддержке этого кодека аппаратами cisco 7911. Мне так и не удалось заставить его работать с этим кодеком, хотя в прошивке его явно указано использовать этот кодек:

<preferredCodec>g729a</preferredCodec>

Видимо это баг, но информации об этом вообще нет.

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

Совершенно не лишним будет разобрать как же все-таки добавить необходимые кодеки в систему где развернута АТС на базе Asterisk. Может конечно данная заметка и не претендует на новизну, но все же она носит практический характер для меня лично, своего рода шпаргалка.

А потому можно и разобрать уже опубликованные заметки присутствующие во всемирной паутине но с акцентом на свое видение.

Asterisk развернут по заметке опубликованной на моем блоге:

$ uname -a && lsb_release -a && asterisk -V

14.04.1-Ubuntu SMP Fri Jul 24 21:16:20 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

No LSB modules are available.

Distributor ID: Ubuntu

Description: Ubuntu 14.04.4 LTS

Виды кодеков для VOIP телефонии

На сколько я вычитал, к одек G.729 позволяет вести много большее количество разговоров при ограниченном канале, что сразу же поднимает его эффективность. В обычном использовании VOIP телефонии используется 64Кбит/с (кодек G711), а тут один звонок уже 8Кбит/с — выгода очевидна.

Вывести информацию по типу процессора и используемым инструкциям процессора:

$ cat /proc/cpuinfo | grep -E 'model name|flags'

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good nopl extd_apicid pni cx16 popcnt hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch arat vmmcall

flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good nopl extd_apicid pni cx16 popcnt hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch arat vmmcall

из этого вывода для текущей заметки является то какие инструкции поддерживает процессор, в моем случае это лишь: sse4a, именно для этой инструкции в дальнейшем и нужно будет скачать уже откомпилированный бинарник.

$ sudo asterisk -rvvvv

Вывод кодеков имеющих место быть установленных в системе

Информация по текущим установленным модулям:

$ sudo asterisk -rx "core show codecs" | grep g726

5 audio g726 (G.726 RFC3551)

6 audio g726aal2 (G.726 AAL2)

/usr/lib/asterisk/modules/codec_g726.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=50045b5d6cb366f0d4e16acdac126e0f943c948e, stripped

Файлы представленные на сайте кодеков имеет следующий формат:

  • g729 → тип кодека
  • ast130 → версия Asterisk 13
  • gcc4 → тип компилятора
  • glibc → библиотеки
  • x86_64 → разрядность процессора и ОС
  • core2 — тип процессора (поколение)
  • sse4 → набор инструкций

Из представленного скриншота ниже видно что к примеру у меня нет кодека g729 — вот установку его и разберу.

srv-host*CLI> quit

Asterisk cleanly ending (0).

Executing last minute cleanups

Скачиваю бинарник файла кодека под свои инструкции которыми может оперировать мой процессор.

Копирую скачанный кодек в папку modules:

$ sudo mv codec_g729-ast130-gcc4-glibc-x86_64-core2-sse4.so /usr/lib/asterisk/modules/

Устанавливаю скачанный кодек:

$ sudo asterisk -rvvv

srv-host*CLI> core reload

srv-host*CLI> module load codec_g729-ast130-gcc4-glibc-x86_64-core2-sse4.so

Проверяю видит ли Asterisk добавленный кодек:

srv-host*CLI> core show translation

странно вывода как раньше нет, значит у меня конфликт того факта что скачанный и установленный модуль не соответствует моей архитектуре процессора. Что ж буду исправляться.

srv-host*CLI> module unload -f codec_g729-ast130-gcc4-glibc-x86_64-core2-sse4.so

srv-host*CLI> quit

Asterisk cleanly ending (0).

Executing last minute cleanups

$ sudo rm /usr/lib/asterisk/modules/codec_g729-ast130-gcc4-glibc-x86_64-core2-sse4.so

$ sudo /etc/init.d/asterisk restart

$ sudo asterisk -rvvv

srv-host*CLI> core show translation

вот теперь вывод есть

$ sudo cp codec_g729-ast130-gcc4-glibc-athlon-sse.so /usr/lib/asterisk/modules/codec_g729.so

$ sudo asterisk -rx "module load codec_g729.so"

Unable to load module codec_g729.so

$ sudo file /usr/lib/asterisk/modules/codec_g729.so

/usr/lib/asterisk/modules/codec_g729.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=fd48fad20f16fe008f2e399dcb60bef6930bcdb2, stripped

codec_g729-ast130-gcc4-glibc-x86_64-opteron.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=7be3620e1cee9ad1f47e69c94c799c78d6407d19, stripped

$ sudo mv codec_g729-ast130-gcc4-glibc-x86_64-opteron.so /usr/lib/asterisk/modules/codec_g729.so

$ sudo asterisk -rx "module load codec_g729.so"

$ sudo /etc/init.d/asterisk restart

Stopping Asterisk PBX: asterisk.

Starting Asterisk PBX: asterisk.

$ sudo /etc/init.d/asterisk status

* Asterisk PBX is running

если не запущен то запускаем:

$ sudo /etc/init.d/asterisk start

Starting Asterisk PBX: asterisk.

$ sudo asterisk -rx "core show translation" | grep g729

ulaw alaw gsm g726 g726aal2 adpcm slin slin slin slin slin slin slin slin slin lpc10 g729 speex speex speex g722 testlaw opus amr amrwb

У меня было, что я не правильную версию модуля скачал, т. е. От другой версии Asterisk — и Asterisk вообще упал — так что сперва в тестовых условиях обкатайте, а уже потом если действительно нужно на боевой системе:

, но у меня он падает

$ sudo asterisk -rvvv

Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)

$ sudo /etc/init.d/asterisk status

* Asterisk PBX is not running

$ sudo tail -f /var/log/syslog

Jul 10 17:08:11 srv-host kernel: [18294.737419] asterisk[3756]: segfault at 40 ip 00007f1f7040c911 sp 00007ffc5e582f48 error 4 in asterisk[7f1f70349000+246000]

По мне так это из-за модуля он конфликтует с используемым типом процессора (у меня же Asterisk установлен внутри Virtualbox — я тестирую). Ладно так и быть удаляю и попробую позже на домашней системе:

$ sudo rm /usr/lib/asterisk/modules/codec_g729.so

$ sudo /etc/init.d/asterisk restart

Stopping Asterisk PBX: asterisk.

Starting Asterisk PBX: asterisk.

$ sudo asterisk -rx "core show translation" | grep g729

вывода нет значит и модуля тоже нет, Asterisk сейчас работает и в логах нет ошибок. Во общем хорошо.

Хоть я и не достиг поставленной цели данной заметкой, но в то же время узнал много нового, а именно ни в коем случае не нужно все делать на продуктиве, лучше потратить некоторое время на тест, обкатать а уже только потом трижды подумать и применять на боевой предварительно сделав бекап. И я считаю, что за сервис должен отвечать только один человек, т. к. если их много то исправив как Вам кажется что-то неправильное на Ваш взгляд Вы все порушите, потому что это был чей-то костыль. А когда весь функционал ведет один человек (к примеру Я сам), то я знаю что и для чего когда либо делалось. На этом я прощаюсь, действия данной заметки я разберу на боевой системе чуть позже и обязательно поделюсь результатами, а пока все, до новых встреч, с уважением автор блога — ekzorchik.

Используйте прокси ((заблокировано роскомнадзором, используйте vpn или proxy)) при использовании Telegram клиента:

Поблагодари автора и новые статьи

будут появляться чаще :)

Карта МКБ: 4432-7300-2472-8059

Большое спасибо тем кто благодарит автора за практические заметки небольшими пожертвованиями. С уважением, Олло Александр aka ekzorchik.

Модератор: april22

Установка кодеков и возможные проблемы

olga.semenova » 02 ноя 2010, 09:57

Добрый день, устанавливала кодеки. Все встали нормально, а вот после устновки G723 астериск не запускается.
Выдал как положенно:
Connected to Asterisk 1.6.2.1 currently running on ccbackup (pid = 11658)
Verbosity is at least 3
== Registered custom function 'DIALGROUP'
func_dialgroup.so => (Dialgroup dialplan function)
== Registered application 'Record'
app_record.so => (Trivial Record Application)
== Registered custom function 'DB'
== Registered custom function 'DB_EXISTS'
== Registered custom function 'DB_DELETE'
func_db.so => (Database (astdb) related dialplan functions)
== Parsing '/etc/asterisk/codecs.conf': == Found
-- codec_adpcm: using generic PLC
== Registered translator 'adpcmtolin' from format adpcm to slin, cost 1
== Registered translator 'lintoadpcm' from format slin to adpcm, cost 1
codec_adpcm.so => (Adaptive Differential PCM Coder/Decoder)
== Registered application 'MinivmRecord'
== Registered application 'MinivmGreet'
== Registered application 'MinivmNotify'
== Registered application 'MinivmDelete'
== Registered application 'MinivmAccMess'
== Registered application 'MinivmMWI'
== Registered custom function 'MINIVMACCOUNT'
== Registered custom function 'MINIVMCOUNTER'
== Parsing '/etc/asterisk/minivm.conf': == Found
app_minivm.so => (Mini VoiceMail (A minimal Voicemail e-mail System))
pbx_loopback.so => (Loopback Switch)
== Registered custom function 'IFMODULE'
func_module.so => (Checks if Asterisk module is loaded in memory)
== Parsing '/etc/asterisk/adsi.conf': == Found
res_adsi.so => (ADSI Resource)
== Parsing '/etc/asterisk/codecs.conf': == Found
== Registered translator 'g723tolin' from format g723 to slin, cost 1000
== Registered translator 'lintog723' from format slin to g723, cost 6999
После этого enable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)
из usr/sbin не запускается. Запускается если отключаю делаю в
[modules]
autoload=no
Подскажите, что могло произойти.

olga.semenova » 02 ноя 2010, 10:28

Перезапустила asterisk, всё отлично. Проверила, что кодек встал через core show translation.

Все кодаки установлены, остался 723. Думаю учитывая положительный опыт установлю так же. codec_g723-ast16-gcc4-glibc-pentium3.so

ded » 02 ноя 2010, 11:08

Слово кодек происходит от сокращения КОдер-ДЕКодер, слово кодак - ассоциируется с компанией Истмен-Кодак по производству фотокамер. По свидельству основателя компании самого Истмена это исскуственное слово он придумал просто чтобы назвать будущую фотокамеру, потому что ему нравились слова с буквы К.

В 1879 году банковский служащий Джордж Истмен разработал машину для нанесения фотоэмульсии на пластины. Патент на машину для массового производства фотопластин был выдан в Англии. В 1881 году промышленник из Рочестера Генри Стронг (Henry A. Strong) основал компанию Eastman Dry Plate Company. В 1884 году Истмен и Стронг преобразовали свою компанию в корпорацию. В 1885 году публике была представлена катушечная фотоплёнка American Film. Истмен нанял химика Генри Рикенбак (Henry H. Reichenbach) для продолжения исследований, и в 1889 году началось производство фотоплёнки.
Слово Kodak

Джорж Истмен говорил, что название торговой марки должно быть: коротким, иметь однозначное прочтение, не должно ни с чем ассоциироваться, кроме Kodak.

Предположительно, слово Kodak было предложено Дэвидом Хьюстоном (David Houston). Хьюстон родился в штате Северная Дакота (сокращённо NoDak). Он был другом Истмена, фотографом-любителем, изобретателем. Компания Kodak приобретала у Хьюстона патенты на фотоаппараты[3].

Буква К была любимой буквой Истмена. Он называл её «сильной, проницательной буквой».

codec_g723-ast16-gcc4-glibc-core2.so
codec_g729-ast16-gcc4-glibc-core2.so
Вроде понятно названы, что заставляет уйти в сторону?

Кодеки G.729 и G.723 используются в Asterisk для того, чтобы экономить полосу пропускания между сервером Asterisk и IP-телефоном.
По сравнению с стандартным кодеком G.711, кодек G.729 потребляет в 3 раза меньше полосы пропускания: 24 кбит/сек по сравнению с 80 кбит/сек в кодеке G.711(alaw/ulaw).
В данной статье мы разберем, как происходит установка кодеков на сервер Asterisk.


Первым делом необходимо определить следующие параметры системы:

  • Версию Asterisk (1.8,11,13 и т.д.)
  • Разрядность ядра Linux (32 или 64 бит)
  • Тип процессора (Opteron, Pentium, Core2 и т.д.)
  • Набор инструкций процессора

В консоли Linux выполняем команду:


Выхлоп этой команды даст нам понимание о том, что за процессор используется на нашем сервере Asterisk.

Далее, выполняем команду


Вывод этой команды показывает нам разрядность процессора.

Зайдя в консоль Asterisk (asterisk -rvvv) и выполнив команду
core show version
узнаем версию Asterisk.


Вот схема, которая поможет вам выбрать правильный кодек:


Далее кодек необходимо скачать на сервер. Рекомендуется сделать это командой wget.

Скаченные кодеки устанавливаются в систему простым копированием их в папку modules:
/var/lib/asterisk/modules или
/var/lib64/asterisk/modules

Далее, либо делаете команду перезапуска сервиса Astersk, либо подгружаете кодеки командой
module load codec_g729..(тут точное название кодека)..so



Команда показывает все доступные системе кодеки и время трансляции из одного кодека в другой. Если на строчке или колонке стоят прочерки, значит, что данного кодека в системе нет.
Если модули не подгружаются, это значит, что вы ошиблись с выбором архитектуры. Внимательно перечитывайте эту статью и делайте еще раз.

Читайте также:

[module name="footer"]