VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

Ответить
Glyanceviy
Сообщения: 5
Зарегистрирован: 15 янв 2025, 20:10

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

Сообщение 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()
Вложения
Показано, что аудиофайл проигрывается. Когда время его длительности истекает, звонок сбрасывается. Только вот звука нету
Показано, что аудиофайл проигрывается. Когда время его длительности истекает, звонок сбрасывается. Только вот звука нету
Исходник файла из DAW и он же, после обработки SOX.
Исходник файла из DAW и он же, после обработки SOX.
Пробовал файлы с разными форматами
Пробовал файлы с разными форматами
Снимок экрана 2025-01-15 202028.png (28.43 КБ) 629 просмотров
Glyanceviy
Сообщения: 5
Зарегистрирован: 15 янв 2025, 20:10

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

Сообщение Glyanceviy »

Продолжаю разбираться в проблеме. Прилагаю tcpdump диалога при вызове. 46.39.42.6 - внешний адрес локальной сети (NAT). 192.168.178.25 - адрес софт фона абонента 1007. 147.45.175.159 - адрес облачного сервера asterisk.
Вложения
Снимок экрана 2025-01-15 232040.png
Glyanceviy
Сообщения: 5
Зарегистрирован: 15 янв 2025, 20:10

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

Сообщение Glyanceviy »

Важная зацепка: выделенный фиолетовым цветом RTP поток - содержит звук! Это важно, потому, что спектр поиска теперь смещается от самого asterisk к правильному построению диалога между участниками.
Вложения
Снимок экрана 2025-01-16 000006.png
Снимок экрана 2025-01-15 235719.png
Glyanceviy
Сообщения: 5
Зарегистрирован: 15 янв 2025, 20:10

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

Сообщение Glyanceviy »

RTP поток выше - тоже содержит звук. Но меня интересует именно нижний - так как в нём мелодия, которая мне нужна
Glyanceviy
Сообщения: 5
Зарегистрирован: 15 янв 2025, 20:10

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

Сообщение 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 диалога на рабочей системе
Вложения
RTP поток от Asterisk поступает на внешний IP роутера, а не на локальный IP клиента, которого не существует в интернете.
RTP поток от Asterisk поступает на внешний IP роутера, а не на локальный IP клиента, которого не существует в интернете.
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH