Asterisk проблема с кодеками
Обстоятельства дела:
- два Cisco CP7940, у обоих выбран Preferred Codec: g729a;
- Asterisk 1.4.11 + Cisco 5350 с потоковой платой;
- sip.conf:
.
disallow=all
allow=g729
allow=ulaw
allow=alaw
allow=gsm
allow=g723
allow=g726
.
[80.251.128.71]
type=friend
context=pstn-incoming
host=80.251.128.71
dtmfmode=rfc2833
insecure=port,invite
disallow=all
allow=g729
[eyatsko]
type=friend
host=dynamic
username=eyatsko
regexten=148
nat=no
;canreinvite=no
context=office
callerid="e.yatsko"
disallow=all
allow=g729
allow=ulaw
allow=alaw
allow=gsm
allow=g723
allow=g726
callgroup=1
pickupgroup=1
[nlagohin]
type=friend
host=dynamic
username=nlagohin
regexten=115
nat=no
;canreinvite=no
context=office
callerid="n.lagohin"
disallow=all
allow=g729
allow=ulaw
allow=alaw
allow=gsm
allow=g723
allow=g726
callgroup=1
pickupgroup=1
.
- extensions.conf:
[pstn-incoming]
exten => 6662823,1,Dial(SIP/eyatsko,3,tT)
exten => 6662823,2,Dial(SIP/eyatsko&SIP/nlagohin,20,tT)
exten => 6662823,3,Hungup
exten => 6662824,1,Dial(SIP/nlagohin,20,tT)
exten => 6662824,2,Hungup
include => ip-phones
[office]
include => ip-phones
[ip-phones]
exten => 148,1,Dial(SIP/eyatsko,20,tT)
exten => 148,2,Hungup
exten => 115,1,Dial(SIP/nlagohin,20,tT)
exten => 115,2,Hungup
exten => nlagohin, 1, Goto(115|1)
exten => 164,1,Dial(SIP/sdolin,20,tT)
exten => 164,2,Hungup
exten => sdolin, 1, Goto(164|1)
- Cisco 5350:
.
voice class codec 1
codec preference 1 g729r8
codec preference 2 g711ulaw
codec preference 3 g711alaw
codec preference 4 g723r63
.
controller E1 2/1
framing NO-CRC4
pri-group timeslots 1-31
.
interface Serial2/1:15
description *** Test Asterisk 80.251.128.148 ***
no ip address
encapsulation hdlc
isdn switch-type primary-net5
isdn incoming-voice data
isdn negotiate-bchan resend-setup cause-code 18
no cdp enable
.
voice-port 2/1:D
.
dial-peer voice 1 pots
description *** Test Asterisk 80.251.128.148 ***
destination-pattern 90.+
direct-inward-dial
port 2/1:D
forward-digits all
!
dial-peer voice 2 voip
description *** Test Asterisk 80.251.128.148 ***
huntstop
preference 1
destination-pattern 6662825
progress_ind setup enable 1
voice-class codec 1
session protocol sipv2
session target ipv4:80.251.128.148
- codecs.conf
.
; enable preprocessor [true / false]
; allows dsp functionality below but incurs CPU overhead
preprocess => true ; как оказалось, не влияет!
.
ПОМОГИТЕ, ПОЖАЛУЙСТА!
Для каждого SIP пользователя, Вам нужно указать поддерживаемые видеокодеки (см. примеры на этой странице). Если Вы не хотите полагаться на согласование видокодеков, которое существует в непропатченном сервере Asterisk версии 1.4.x (и не всегда корректно работает), убедитесь, что вы разрешили только один кодек для видео в Вашем файле sip.conf. Для решения этой проблемы, можно воспользоваться патчем, который описан ниже. И конечно, видеокодеки должны поддерживаться SIP телефонами, которые подключены к серверу Asterisk. Asterisk может работать только в прозрачном режиме при передаче видеопотоков.
Видеоконверторы для Asterisk
- FFasterisk: Утилита для создания видео контекста для Asterisk. Она позволяет конвертировать MOV файлы в пару файлов .H.263 (для видео) и .wav (для звука), с которыми может работать сервер Asterisk.
Программное обеспечение для создания видеоконференций в Asterisk.
- 1videoConference: VVoIP Решение с открытыми исходными кодами от Adiance.
- Mediamixer от Sergio Murillo.
- app_conference: имеет ограниченную поддержку видео.
- Confiance.
Некоторые основные моменты, относительно использования видео в Asterisk
В сервере asterisk версии 1.4, выбор видеокодека содержит дефекты в алгоритме (также смотри данный bug report). Для решения это проблемы IVèS предложил патч, но он не был принят. Кроме того, другая независимая разработка с названием Asterisk videocaps, позволяет надлежащим образом согласовывать fmtp атрибуты, связанные с передачей видеопотоков, в SDP. Это решение было включено в trunk и может быть появится в Asterisk 1.6.
В asterisk 1.6 запланирована глобальная перестройка поддержки видео для различных каналов, но никаких технических условий по реализации не было опубликовано. Кто-то просто хочет включить поддержку videocaps и остановиться на этом. Некоторые имеют более амбициозные планы на этот счет. Рекомендуется ознакомиться со списком рассылки: Asterisk video.
Другая проблема, связана с форматом файлов, которые содержат видео приветствия и подсказки. На данный момент, Asterisk записывает содержимое RTP пакетов, включая некоторую информацию, связанную с таймингом, в файлы с расширением .h263, ph263p, .h264. Sergio Murillo разработал приложение MP4 asterisk apps, которое может проигрывать и записывать файлы в формате MPEG4. Но проблемы, связанные с патентами, не дают возможность компании Digium интегрировать это приложение в состав сервера Asterisk.
Поддержка перекодирования из одного видеокодека в другой (транскодинг) также не поддерживается и, вероятно, не будет поддерживаться в сервере Asterisk. Использование библиотеки ffmpeg для этих целей опять создаст проблемы с лицензированием и патентами. Транскодирование видеокодеков в Asterisk также создает проблемы связанные с уменьшением производительности сервера в целом. Однако, Sergio предложил приложение, которое может выполнять некоторые ограниченные функции, связанные с транскодированием видеокодеков, оно базируется на библиотеке ffmpeg и называется - app_transcoder. Приложение имеет ограничения в текущей версии, но может быть легко расширено по функциональности теми, кто имеет опыт программирования с использованием библиотеки ffmpeg.
Последний момент, представляющий интерес, это возможность обработки ISDN/3G видеовызовов с помощью Asterisk, используя разработки от Sergio. Для дополнительной информации по этому вопросу, смотри: эту страницу.
Следующее клиенты имеют поддержку видео, которая работает совместно с сервером Asterisk:
There is also some information how to make an 3G-H.324M (UMTS Video) - SIP gateway with asterisk: Asterisk H324M
Некоторые моменты, касающиеся голосовой почты и поддержки видео.
Call Image Videotel - содержит специальные возможности для создания нормальной записи, без каких-либо модификаций самого сервера asterisk (Замечание: на данный момент линк битый. Или videotel изменил имя страницы или прекратил поддержку данного продукта).
Настройка Windows Messenger для работы с сервером Asterisk (по протоколу SIP)
Пример настройки файла sip.conf:
[general]
videosupport=yes
[video2]
type=friend
username=video2
secret=hidden
host=dynamic
context=from-camera
callerid=Video 2
canreinvite=no
disallow=all ; Windows Messenger выбирает неправильные кодеки, если указать: allow=all
allow=ulaw
allow=alaw
allow=speex
allow=gsm
allow=h261
allow=h263
allow=h263p
Совершенно не лишним будет разобрать как же все-таки добавить необходимые кодеки в систему где развернута АТС на базе Asterisk. Может конечно данная заметка и не претендует на новизну, но все же она носит практический характер для меня лично, своего рода шпаргалка.
А потому можно и разобрать уже опубликованные заметки присутствующие во всемирной паутине но с акцентом на свое видение.
Asterisk развернут по заметке опубликованной на моем блоге:
ekzorchik@srv-host:~$ uname -a && lsb_release -a && asterisk -V
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.4 LTS
На сколько я вычитал, к одек G.729 позволяет вести много большее количество разговоров при ограниченном канале, что сразу же поднимает его эффективность. В обычном использовании VOIP телефонии используется 64Кбит/с (кодек G711), а тут один звонок уже 8Кбит/с — выгода очевидна.
Вывести информацию по типу процессора и используемым инструкциям процессора:
ekzorchik@srv-host:~$ 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, именно для этой инструкции в дальнейшем и нужно будет скачать уже откомпилированный бинарник.
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
Файлы представленные на сайте кодеков имеет следующий формат:
- g729 → тип кодека
- ast130 → версия Asterisk 13
- gcc4 → тип компилятора
- glibc → библиотеки
- x86_64 → разрядность процессора и ОС
- core2 — тип процессора (поколение)
- sse4 → набор инструкций
Из представленного скриншота ниже видно что к примеру у меня нет кодека g729 — вот установку его и разберу.
srv-host*CLI> quit
Asterisk cleanly ending (0).
Executing last minute cleanups
Скачиваю бинарник файла кодека под свои инструкции которыми может оперировать мой процессор.
Копирую скачанный кодек в папку 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:~$ 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:~$ 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.
Если Asteriskу в sip.conf разрешить использовать все кодеки, то происходит такое:
При звонке он выбирает разные кодеки для IP-телефона и X-Lite, и после поднятия трубки происходит разрыв.
В лог пишется например
NOTICE[60735]: channel.c:1724 ast_set_read_format: Unable to find a path from alaw to g723
NOTICE[60735]: channel.c:1691 ast_set_write_format: Unable to find a path from g723 to alaw
При обратном звонке всё нормально, выбирается g711.
Насколько я понимаю, почему-то не работает автосогласование кодеков! Хотя каждая стороная имеет много кодеков, среди которых есть одинаковые (в данном примере это только G711), они выбирают кодеки которые хотят, и соединение установить не получается!
Далее при звонке с X-Lite через провайдера на город, соединение устанавливается (G711), но в лог всё равно пишется про невозможности трансляции из G723 в G711 и наоборот. Видимо сначала удалённый шлюз пытается использовать G723 но получив отказ, всё же переключается на G711
При звонке с IP-телефона на город всё нормально (используется G723).
Кстати в IP-телефоне выставлен следующий приоритет кодеков. G723, G729, G711a, G711u
В Asterisk
disallow=all
allow=g723
allow=g729
allow=alaw
allow=gsm
allow=ulaw
allow=ilbc
Если же я меняю так:
disallow=all
allow=g723
allow=g729
allow=gsm
allow=alaw
allow=ulaw
allow=ilbc
то при звонке с D-Link на X-Lite уже пишет о невозможности транслировать GSM (до этого говорило G711) в G723
На автоинформаторы же сипнета с X-Lite позвонить невозможно вообще, так как они упорно хотят работать в G723 и опять пишется о невозможности транслировать G711 в G723 и наоборот.
НО! Когда я звоню с D-Linka (который поддерживает G723) пишется то же самое! Почему он сразу не выбирает этот кодек?
Временно решил я проблемы со связью во внутренней сети с помощью разрешения только G711
Его поддерживает всё. Но проблемы всё же остались:
1. На автоинформаторы сипнета позвонить нельзя
2. Дорого платить за трафик G711 при звонках на город, забивается канал, падает качество.
Так что это совсем не годится.
Подскажите, пожалуйста, как заставить оконечные устройства согласовывать кодеки!
астериск не ругается, но с Еутелии звонок не проходит, просто скидывается , и всё.
Вывод show translation
G711alaw, G711ulaw, G723ar53, G723ar63, G723r53, G723r63, G726r16, G726r24, G726r32, G728, G729br8, G729r8, GSM-EFR, GSM-FR.
Поддерживаемые кодеки с офф сайта Еутелии -
Подскажите, где покрутить ?
Asterisk ver 1.4.22.1
allow=h323 ? Прикольно, надо будет использовать.
А порядок измените на такой:
disallow=all ; First disallow all codecs
allow=alaw
allow=ulaw ; Allow codecs in order of preference
allow=g729
allow=g723
allow=gsm
не понятно, откуда у вас взялся g722, которого нет на вашем астериске и в поддерживаемых кодеках с офф сайта Еутелии
Проблему решил.
Надо было поставить dtmfmode=inband )))
Ещё вопросик, как обработать такую ситуацию :
Человек звонит на наш сервер, вводит добавочным мобильный номер (в таком случае звонок идёт на VoIP шлюз), но на данный момент шлюз занят (уже идёт разговор), как сделать, чтобы астериск переадрисовывал вызов на другой номер sip ?
menlfik, сообщите номер вашего сервера, чтобы мы тоже могли вводить добавочным мобильный номер чтобы все могли звонить через ваш VoIP шлюз.
мне всегда была непонятна способность "решить проблему" подкрутив что-то скорее всего к проблеме не относящееся.
"у меня НАТ на роутере кривой, не позволяет серверу в нет ходить но я проблему решил воткнув сервер в другой порт на свитче". вот как-то так.
Разумеется бывает. Но "решив" одну проблему таким образом приносят кучу других.
Мой поинт был в том что вместо того чтобы _разобраться_ что не так с НАТом и починить его (подняв экспириенс при этом) народ идет совершенно неведомыми науке путями и делает очень странные и спорные "фиксы". И даже если волей случая один из фиксов или их омбинация помогут (что бывает) - то имхо ценность такого знания ноль. Ибо во-первых не понимают что чинили во вторых не понимают как, в третьих повторюсь, возможно "решение" несет больше проблем чем было просто они сразу не видны.
Воистину готов согласится с тем что "админ может решить проблему но не может объяснить как он это сделал".
Часто бывает, что прямо сейчас лишь бы починить, потому что юзеры катят бочку, руководство звереет, обстановка накаляется. Вот и начинает народ шаманить. А когда волею случая удается - человек облегченно вздыхает и забывает о проблеме до следующего проявления.
Разбираться с чашечкой кофе хорошо вечерком, в спокойной обстановке. А когда надо быстро поднять сервис - не до разборок. Перезапустил чего-нибудь, как-то завелось - и ладно.
Это все справедливо, если ты не до конца разбираешься в вопросе. Если профи - докопаешься в любой обстановке и сделаешь по-хорошему. Но, судя по обилию топиков, начинающихся на "добрый день, я не телефонист и астер не видел никогда, но начальство приказало. ", описанный мной сценарий реален.
Но, судя по обилию топиков, начинающихся на "добрый день, я не телефонист и астер не видел никогда, но начальство приказало. ", описанный мной сценарий реален.
Ага. А потом после удачного ребута эти люди пишут себе в резюме "установил и поддерживал Астериск на предприятии" :)
Читайте также: