Как добавить кодеки в Asterisk

Posted by

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

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

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

ekzorchik@srv-host:~$ uname -a && lsb_release -a && asterisk -V

Linux srv-host 3.19.0-25-generic #26~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: .4 LTS

Release: 14.04

Codename: trusty

Asterisk 13.9.1~dfsg-0~ppa1

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

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

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

ekzorchik@srv-host:~$ cat /proc/cpuinfo | grep -E 'model name|flags'

model name : AMD A8-3850 APU with Radeon(tm) HD Graphics

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

model name : AMD A8-3850 APU with Radeon(tm) HD Graphics

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, именно для этой инструкции в дальнейшем и нужно будет скачать уже откомпилированный бинарник.

После идет на сайт: http://asterisk.hosting.lvнажимаю на Asterisk 13 (буду скачивать бинарники, файла с расширением *.so) и скачиваем к себе необходимый кодек тот который Вам нужен, а узнать действительно ли мне его нужно устанавливать, может все же проверить какие присутствуют:

ekzorchik@srv-host:~$ sudo asterisk -rvvvv

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

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

ekzorchik@srv-host:~$ sudo asterisk -rx "core show codecs" | grep g726

5 audio g726 (G.726 RFC3551)

6 audio g726aal2 (G.726 AAL2)

ekzorchik@srv-host:~$ file /usr/lib/asterisk/modules/codec_g726.so

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

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

codec_g729-ast130-gcc4-glibc-x86_64-core2-sse4.so

, где:

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

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

srv-host*CLI> quit

Asterisk cleanly ending (0).

Executing last minute cleanups

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

ekzorchik@srv-host:~$ wget http://asterisk.hosting.lv/bin/codec_g729-ast130-gcc4-glibc-x86_64-core2-sse4.so

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

ekzorchik@srv-host:~$ sudo mv codec_g729-ast130-gcc4-glibc-x86_64-core2-sse4.so /usr/lib/asterisk/modules/

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

ekzorchik@srv-host:~$ 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

ekzorchik@srv-host:~$ sudo rm /usr/lib/asterisk/modules/codec_g729-ast130-gcc4-glibc-x86_64-core2-sse4.so

ekzorchik@srv-host:~$ sudo /etc/init.d/asterisk restart

ekzorchik@srv-host:~$ sudo asterisk -rvvv

srv-host*CLI> core show translation

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

Ладно исправляюсь:

ekzorchik@srv-host:~$ wget http://asterisk.hosting.lv/bin/codec_g729-ast130-gcc4-glibc-athlon-sse.so

ekzorchik@srv-host:~$ sudo cp codec_g729-ast130-gcc4-glibc-athlon-sse.so /usr/lib/asterisk/modules/codec_g729.so

ekzorchik@srv-host:~$ sudo asterisk -rx "module load codec_g729.so"

Unable to load module codec_g729.so

Command ‘module load codec_g729.so’ failed.

Это по тому что, что я не внимателен и библиотека для 32‘битной архитектуры

ekzorchik@srv-host:~$ 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

Исправляюсь повторно:

ekzorchik@srv-host:~$ wget http://asterisk.hosting.lv/bin/codec_g729-ast130-gcc4-glibc-x86_64-opteron.so

ekzorchik@srv-host:~$ file codec_g729-ast130-gcc4-glibc-x86_64-opteron.so

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

ekzorchik@srv-host:~$ sudo mv codec_g729-ast130-gcc4-glibc-x86_64-opteron.so /usr/lib/asterisk/modules/codec_g729.so

ekzorchik@srv-host:~$ sudo asterisk -rx "module load codec_g729.so"

ekzorchik@srv-host:~$ sudo /etc/init.d/asterisk restart

Stopping Asterisk PBX: asterisk.

Starting Asterisk PBX: asterisk.

ekzorchik@srv-host:~$ sudo /etc/init.d/asterisk status

* Asterisk PBX is running

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

ekzorchik@srv-host:~$ sudo /etc/init.d/asterisk start

Starting Asterisk PBX: asterisk.

ekzorchik@srv-host:~$ 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

g729 15000 15000 15000 15000 15000 15000 9000 17000 17000 17000 17000 17000 17000 17000 17000 15000 — 15000 23000 23000 17250 15000 17250 15000 23000

у меня в колонке символ дефиса («-») — это значит что в системе нет данного кодека, не совсем точно подходит архитектура скачанного модуля и тип используемых инструкций.

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

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

ekzorchik@srv-host:~$ sudo asterisk -rvvv

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

ekzorchik@srv-host:~$ sudo /etc/init.d/asterisk status

* Asterisk PBX is not running

По логам:

ekzorchik@srv-host:~$ 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 — я тестирую). Ладно так и быть удаляю и попробую позже на домашней системе:

ekzorchik@srv-host:~$ sudo rm /usr/lib/asterisk/modules/codec_g729.so

ekzorchik@srv-host:~$ sudo /etc/init.d/asterisk restart

Stopping Asterisk PBX: asterisk.

Starting Asterisk PBX: asterisk.

ekzorchik@srv-host:~$ sudo asterisk -rx "core show translation" | grep g729

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

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