Страница 1 из 1

Нет звука от Playback(), Background(), MusicOnHold() при вызове. Нет звука от любых аудиофайлов любых форматов.

Добавлено: 15 янв 2025, 21:02
Glyanceviy
[Общая обстановка]
Есть два абонента pjsip с номером 1 и номером 1007. Успешно зарегистрированы на софтфонах Linphone, можно созваниваться, голос слышно в двухстороннем порядке.

[Топология сети]
Оба абонента находятся в одной локальной сети. На роутере есть статический внешний ip адрес. Сервер asterisk расположен в интернете, тоже имеет статический ip.

[Цель]
При звонке абоненту 1 с телефона абонента 1007, хочу чтобы играла мелодия: реализуя любым возможным методом

[Проблема]
Все аудиофайлы (предустановленные или кастомные), которые я указывал для приложений Playback(), Background(), MusicOnHold(), в разных кодировках (alaw, uklaw, gsm, wav и.т.п) внутри extensions.conf успешно загружаются (как показывает CLI) и проигрываются (следующее выражение после Playback() наступает через время длины аудиофайла). Но при звонке, ничего не слышно, как будто все аудиофайлы пустые.
В интернете информации по этой проблеме не нашёл.

[Ниже представлены pjsip.conf и extensions.conf]

pjsip.conf

Код: Выделить всё

[1]
type = endpoint
transport = udp-transport
disallow = all
allow = alaw
auth = 1
aors = 1
context = user_context
[1]
type = auth
auth_type = userpass
username = username
password = password
[1]
type = aor
max_contacts = 1
maximum_expiration = 120000
minimum_expiration = 100
remove_existing = yes
(пользователь 1007 точно так же настроен, только вместо 1 - 1007)

[extensions.conf]

Код: Выделить всё

[user_context]
exten => 1,1,Wait(5)
exten => 1,n,Answer()
        same => n,Playback(/usr/share/asterisk/sounds/recordings/fromCLI2)
        same => n,Hangup()

Re: Нет звука от Playback(), Background(), MusicOnHold() при вызове. Нет звука от любых аудиофайлов любых форматов.

Добавлено: 15 янв 2025, 23:33
Glyanceviy
Продолжаю разбираться в проблеме. Прилагаю tcpdump диалога при вызове. 46.39.42.6 - внешний адрес локальной сети (NAT). 192.168.178.25 - адрес софт фона абонента 1007. 147.45.175.159 - адрес облачного сервера asterisk.

Re: Нет звука от Playback(), Background(), MusicOnHold() при вызове. Нет звука от любых аудиофайлов любых форматов.

Добавлено: 16 янв 2025, 00:03
Glyanceviy
Важная зацепка: выделенный фиолетовым цветом RTP поток - содержит звук! Это важно, потому, что спектр поиска теперь смещается от самого asterisk к правильному построению диалога между участниками.

Re: Нет звука от Playback(), Background(), MusicOnHold() при вызове. Нет звука от любых аудиофайлов любых форматов.

Добавлено: 16 янв 2025, 00:08
Glyanceviy
RTP поток выше - тоже содержит звук. Но меня интересует именно нижний - так как в нём мелодия, которая мне нужна

Решение проблемы.

Добавлено: 18 янв 2025, 17:22
Glyanceviy
Оказывается проблема была типичная для SIP, как я понял, перешерстив весь интернет. Называется она по сетевой топологии: "Астериск в облаке, клиенты за NAT".
Суть в том, что клиент, при звонке, в первом запросе INVITE в поле via указывает свой "контактный" IP адрес для дальнейшего SIP диалога и RTP потока с данными. Этот адрес - локальный IP. В дальнейшем, при инициализации RTP потока от сервера Asterisk к звонящему, RTP направляется на Локальный адрес. Но этот адрес спрятан за NAT и в интернете его не существует. Отсюда и потеря входящего звука.

Типичные решения для данной проблемы - указание в PJSIP конфигурации rewrite_contact = yes и rtp_symmetric = yes, которые позволяют игнорировать адрес указанный в строке VIA SIP заголовка. Вместо этого адреса используется непосредственно IP с которого пришёл пакет. Так как пакет поступая на роутер, меняет свой адрес, на адрес роутера, то обратный RTP поток поступит не на локальный адрес (которого в интернете нет), а на внешний адрес роутера. Роутер "помнит" весь диалог, и направит поток на локальный адрес клиента.
Ещё можно указать на клиентском устройстве STUN-сервер. На сервере Asterisk это тоже можно сделать в файле rtp.conf.

Всё это я выполнил. НО ПРОБЛЕМА НЕ ИСЧЕЗАЛА! Тогда в полном уже отчаянии, я решил попробовать использовать на клиенте не Linphone, а Zoiper. Скачал, ввёл тот же клиентский аккаунт и всё заработало! В Zoiper не пришлось даже STUN указывать.
Прикрепляю фото SIP диалога на рабочей системе