Нет, не просто пошуметь, ой как не просто пошуметь. Я пользуюсь asterisk с самых первых версий (с 1.0, если точнее). Вышел он как раз по-моему когда я начал заниматься VoIP — 3 года назад. Как много времени прошло, насколько больше функций стало в астериске. Но одно остаётся неизменным :) Кто пользуется SIP провайдерами и не видел сообщения «Comfort noise support incomplete in Asterisk RFC 3389. Please turn off on client IP.»? Да, в астериске нет до сих пор поддержки CNG и VAD.

Вкратце что это такое:
Во время телефонного звонка существует особенность: обычно говорит только один абонент, а второй слушает. При этом вполне логично, что информация передаётся только в одном направлении: от говорящего к слушателю. При этом вовсе не обязательно передавать голосовую информацию. Но тут сразу возникает чисто психологический момент: если говорящий слышит абсолютную тишину в трубке, то онт обязательно спросит: «Алло, алло! Вы меня слышите?». Поэтому логично вместо тишины выдавать в трубку шум. Собственно VAD — процесс выявление пауз в разговоре и прекращение передачи голосовых фреймов. CNG — генерация шума на стороне говорящего абонента.

Ни то не другое не реализовано в астериске, хотя попытки были. Вот какие изменения требуются, исходя из того что я прочитал. Может я что-то не так понял, поправьте:
1) Первое и самое малое: требуется генератор белого шума. Я взял когда-то написанный модуль, стряхнул пыль и отправил версию для trunk в трекер.
2) Поддержку CNG имеют не все кодеки. Поэтому в код, который занимается трансляцией из одного кодека в другой CNG можно просто добавить как очередной кодек. Разрешение использовать CNG можно записывать как кодек cng и vad прямо в список кодеков.
3) DSP астериска нужно научить распознавать интервалы тишины, чтобы в нужный момент прекращать передачу голосовых фреймов.
4) Существуют ещё какие-то проблемы с jitter буфером, ещё не разобрался.

Кажется, в данный момент астериск при получении CNG фреймов просто прекращает передачу RTP. И тишина...

Похожие сообщения:

автор igorg \\ теги: , , , ,

  • Mosk

    Здравствуйте!!!

    Это проблема меня очень сильно волнует т.к. в нашей сети используются шлюзы с огромным количеством E1, при этом трафик ходит через узкие места на спутник, гнать VoIP трафик на спутник без VAD это дорогого стоит.

    Так вот я искал решение этой проблемы нашел только res_noice.c под asterisk 1.2 но у нас стоит 1.4, в общем он не собирается.

    А проблема, такая как только астериск получает RTP пакет с len-ом 1 или 2 (у меня такой) так он сразу начинает затыкаться, просто не шлет RTP пакеты.

    Мне кажется решение в такой ситуации есть, т.к. asterisk 1.4 умеет работать Peer-to-Peer (RTP), то asterisk должен не проверять длину пакета и отдавать голос в любом случаи. Т.е. IVR и MOH будет работать как надо. Если я не ошибаюсь.

    Но я не программер и сам этого сделать не могу.

    И мне также не понятно, почему еще ни кто этого не сделал?

    Что ни у кого нет такой проблемы?

  • http://igorg.ru igorg

    res_noise.c ничем тут не поможет, так как он содержит в себе только генератор шума. Версия для trunk уже выложена мной на трекере.

    Ваша проблема, видимо, в том что не загружен модуль ztdummy, который нужен для работы таймера. Без него исходящие RTP пакеты отправляются только в момент прихода входящих, а CN пакеты отправляются только при появлении пауз.

    Тут дело не в длине пакета и не в RassThrough режиме прохождения RTP.

  • Mosk

    Буду очень признателен за ссылочку на трекер.

    А на счет ztdummy он загружен:

    Module Size Used by

    ztdummy 9128 0

    zaptel 186404 25 ztdummy

    Спасибо за ответ.

  • http://igorg.ru igorg

    bugs.digium.com

    Конкретно res_noise здесь:

    bugs.digium.com/view.php?id=11534

    Если ztdummy загружен, то нужно разбираться, смотреть 'rtp debug'.

  • Mosk

    Спасибо за ссылку, а то я видел только это

    bugs.digium.com/view.php?id=5409

  • Mosk

    Пытался разобраться когда asterisk перестает слать пакеты при работе IVR и MOH.

    В общем когда приходит CN (т.е. в * перестает идти RTP паток) то asterisk сразу начинает молчать, что и вызывает затык в проговаривании/проигровании.

    Как только я убираю VAD на шлюзе которого я делаю вызов. Все прекрасно работает.

    Если Вы говорите что при загруженном модуле ztdummy такого не должно быть, то я вообще не понимаю в чем может быть дело. У меня два asterisk на обоих такая проблемма.

    PS: Пытался собрать res_noice с вашим patch не собираеться на 1.4 :

    res_noise.c: In function ‘noise_exec’:

    res_noise.c:254: warning: implicit declaration of function ‘ast_debug’

    res_noise.c: At top level:

    res_noise.c:611: warning: no previous prototype for ‘description’

    res_noise.c:616: warning: no previous prototype for ‘usecount’

    res_noise.c: In function ‘usecount’:

    res_noise.c:618: warning: implicit declaration of function ‘STANDARD_USECOUNT’

    res_noise.c: At top level:

    res_noise.c:623: warning: function declaration isn’t a prototype

    make[1]: *** [res_noise.o] Error 1

    make: *** [res] Error 2

    Обидно.

  • http://igorg.ru igorg

    Этот патч для trunk, и в вашей ситуации он никак не поможет. Насчёт проблемы с IVR и MOH — я постараюсь повторить это у себя и определить в чём проблема.

  • Mosk

    Буду очень презнателен.

    Спасибо.

  • Mosk

    Да уж решил свою проблему не думал, что все так просто, при запуске скрипта safe_asterisk надо поставить -I.

    -I — Enable internal timing if Zaptel timer is available

    и счастье :-)

    Самое странное что я этого не где в описании не встречал. Может просто только я не заметил данную опцию при использовании внутреннего таймера через zaptel.

    Igorg спасибо за помощь. Если бы Вы не сказали что проблема не в CNG я бы до сихпор мучался.

  • http://igorg.ru igorg

    Ну или в asterisk.conf опция internal_timing=yes