Проблема с воспроизведением музыкального фона при разговоре
Добавлено: 09 мар 2016, 11:53
Всем привет. Собственно само тз: "Соединить 2х клиентов (оба используют мобильную связь) и добавить им музыкальный фон на время беседы".
Версия: Asterisk 11.17.0
Сама задача решена с помощью 2х call файлов (первый соединяет клиентов, второй подключает chanspy и музыку:
# Cоединяем клиента 79376538527 с 79250901402
Channel: Local/79376538527@mobile/nj
CallerID: 78462070121
Context: client
Extension: 79250901402
# Dialplan
[mobile]
exten =>_[78]9XXXXXXXXX,1,Set(CALLERID(num)=79376538526)
exten =>_[78]9XXXXXXXXX,n,NoOp(${CHANNEL})
exten =>_[78]9XXXXXXXXX,n,Dial(SIP/link/${EXTEN})
[client]
exten =>_[78]9XXXXXXXXX,1,Set(CALLERID(num)=79376538123)
exten =>_[78]9XXXXXXXXX,n,NoOp(${CHANNEL})
; 2201955 номер файла, который будет проигрываться для фона
exten =>_[78]9XXXXXXXXX,n,Dial(SIP/link/${EXTEN},30,M(music,${CHANNEL},220195))
# После поднятия ответа клиента Б, идем в:
[macro-music]
; 12323 - просто имя для нового call файла
exten => s,1,AGI(tone.php,12323,${ARG1},${ARG2});
Суть AGI - создать еще один call файл, который запустит chanspy в канал, в котором уже есть разговор, и второй ногой в контекст, который будет проигрывать мелодию:
# этот подключается
[spy]
exten => s,1,ChanSpy(${channel},bqBE)
exten => s,n,Hangup
# этот проигрывает по кругу, пока люди не наговорятся
[spy_music]
exten => 1,1,Answer
exten => 1,n,Wait(1)
exten => 1,n,Set(ROW_COUNTER=0)
exten => 1,n,While($[${ROW_COUNTER} < 100])
exten => 1,n,Playback(/u00/soundin/220195)
exten => 1,n,Set(ROW_COUNTER=$[ ${ROW_COUNTER} + 1 ])
exten => 1,n,EndWhile()
exten => 1,n,Hangup
Перед тем, как проиграть мелодию, она обрабатывается через sox (нормализация и понижение громкости. Обработка происходит после скачивания файла с нашего сервера).
Все работает, клиенты слышат друг друга, фоновая музыка играет. В примерах прописаны статичные файлы, т.к. все в рамках тестирования.
Проблема пришла оттуда, откуда не ждали. Иногда, во время разговора у одного из участников, в момент его речи пропадает музыка. Т.е. он говорит - пропадает, замолкает - музыка продолжается. В этот момент у второго участника разговора все отлично. Проблемная сторона при этом рандомная, т.е. нет разницы кому звонить первым, это может быть как у клиента А, так и у Б.
Пробовал выставлять джиттер - не помогает.
Ужимал файл до:
Channels : 1
Sample Rate : 8000
Precision : 16-bit - Не помогает
Выставлял в asterisk.conf
internal_timing = yes
Отключал vad и игрался с качеством кодеков в codecs.conf
Пробовал на 2х серверах (железо и виртуалке (на виртуалке проблем с ivr нет)) - разницы нет.
Все вызовы проходят через g.711 alaw (пробовал через 2х операторов).
Ничего не помогает.
При этом, проблема НЕ наблюдается, если:
1. Один из участников разговора sip клиент
2. Не уменьшать громкость мелодии (но это не вариант, люди друг друга не будут слышать)
Я уже хз что думать, и куда копать. Может подскажете?
У меня остались только мысль, что это либо вообще проблемно сделать в мобильных сетях, либо какая-то лажа с транскодингом (тестировал во время полного отсутствия на сервер)
Никаких ошибок в лог не падает.
Ну и второй вопрос, можно ли вышеизложенное осуществить без chanspy? Я пробовал макросом сразу запускать Playback, но слышит только одна сторона, а вторая висит на линии и ждет ответа.
Версия: Asterisk 11.17.0
Сама задача решена с помощью 2х call файлов (первый соединяет клиентов, второй подключает chanspy и музыку:
# Cоединяем клиента 79376538527 с 79250901402
Channel: Local/79376538527@mobile/nj
CallerID: 78462070121
Context: client
Extension: 79250901402
# Dialplan
[mobile]
exten =>_[78]9XXXXXXXXX,1,Set(CALLERID(num)=79376538526)
exten =>_[78]9XXXXXXXXX,n,NoOp(${CHANNEL})
exten =>_[78]9XXXXXXXXX,n,Dial(SIP/link/${EXTEN})
[client]
exten =>_[78]9XXXXXXXXX,1,Set(CALLERID(num)=79376538123)
exten =>_[78]9XXXXXXXXX,n,NoOp(${CHANNEL})
; 2201955 номер файла, который будет проигрываться для фона
exten =>_[78]9XXXXXXXXX,n,Dial(SIP/link/${EXTEN},30,M(music,${CHANNEL},220195))
# После поднятия ответа клиента Б, идем в:
[macro-music]
; 12323 - просто имя для нового call файла
exten => s,1,AGI(tone.php,12323,${ARG1},${ARG2});
Суть AGI - создать еще один call файл, который запустит chanspy в канал, в котором уже есть разговор, и второй ногой в контекст, который будет проигрывать мелодию:
# этот подключается
[spy]
exten => s,1,ChanSpy(${channel},bqBE)
exten => s,n,Hangup
# этот проигрывает по кругу, пока люди не наговорятся
[spy_music]
exten => 1,1,Answer
exten => 1,n,Wait(1)
exten => 1,n,Set(ROW_COUNTER=0)
exten => 1,n,While($[${ROW_COUNTER} < 100])
exten => 1,n,Playback(/u00/soundin/220195)
exten => 1,n,Set(ROW_COUNTER=$[ ${ROW_COUNTER} + 1 ])
exten => 1,n,EndWhile()
exten => 1,n,Hangup
Перед тем, как проиграть мелодию, она обрабатывается через sox (нормализация и понижение громкости. Обработка происходит после скачивания файла с нашего сервера).
Все работает, клиенты слышат друг друга, фоновая музыка играет. В примерах прописаны статичные файлы, т.к. все в рамках тестирования.
Проблема пришла оттуда, откуда не ждали. Иногда, во время разговора у одного из участников, в момент его речи пропадает музыка. Т.е. он говорит - пропадает, замолкает - музыка продолжается. В этот момент у второго участника разговора все отлично. Проблемная сторона при этом рандомная, т.е. нет разницы кому звонить первым, это может быть как у клиента А, так и у Б.
Пробовал выставлять джиттер - не помогает.
Ужимал файл до:
Channels : 1
Sample Rate : 8000
Precision : 16-bit - Не помогает
Выставлял в asterisk.conf
internal_timing = yes
Отключал vad и игрался с качеством кодеков в codecs.conf
Пробовал на 2х серверах (железо и виртуалке (на виртуалке проблем с ivr нет)) - разницы нет.
Все вызовы проходят через g.711 alaw (пробовал через 2х операторов).
Ничего не помогает.
При этом, проблема НЕ наблюдается, если:
1. Один из участников разговора sip клиент
2. Не уменьшать громкость мелодии (но это не вариант, люди друг друга не будут слышать)
Я уже хз что думать, и куда копать. Может подскажете?
У меня остались только мысль, что это либо вообще проблемно сделать в мобильных сетях, либо какая-то лажа с транскодингом (тестировал во время полного отсутствия на сервер)
Никаких ошибок в лог не падает.
Ну и второй вопрос, можно ли вышеизложенное осуществить без chanspy? Я пробовал макросом сразу запускать Playback, но слышит только одна сторона, а вторая висит на линии и ждет ответа.