Дмитрий Кайдаш
13.06.2019
24950

Настройка хранения записей в mp3 на Asterisk+FreePBX.

Описание: в ряде интеграций АТС на базе asterisk возникла необходимость конвертации wav в mp3. В частности, это нужно для корректной прослушки записей методом обратного звонка в MIKO (что это и как настраивать описано в статье https://voxlink.ru/kb/asterisk-configuration/ustanovka-modulya-1c-ot-miko-na-freepbx-2-11-s-asterisk-11/) и значительно (а так же безопасно) экономит место на носителях. Чтобы этого достичь нам понадобится: найти триггер обработки завершения […]

Описание: в ряде интеграций АТС на базе asterisk возникла необходимость конвертации wav в mp3. В частности, это нужно для корректной прослушки записей методом обратного звонка в MIKO (что это и как настраивать описано в статье https://voxlink.ru/kb/asterisk-configuration/ustanovka-modulya-1c-ot-miko-na-freepbx-2-11-s-asterisk-11/) и значительно (а так же безопасно) экономит место на носителях.

Чтобы этого достичь нам понадобится:

  • найти триггер обработки завершения вызова с возможностью передачи аргументов
  • написать скрипт-конвертор который и будет выполнять нашу задачу

Перейдём к описанию.

К счастью триггер уже есть в интерфейсе администрирования FreePBX. Но он скрыт по-умолчанию, чтобы его найти нужно перейти в «advanced settings» и включить два следующие пунта:

Отображение дополнительных пунктов

После чего поиском по странице ищем пункт «Post Call Recording Script»

Триггер после вызова

Как и гласит название и подсказка, это то что нам нужно: поле для указания скрипта который выполнится при завершении каждого вызова. И помимо прочего он может принимать аргументы. Добавим сюда строчку следующего вида:

/var/lib/asterisk/agi-bin/realtime_transfer.sh ^{YEAR} ^{MONTH} ^{DAY} ^{CALLFILENAME}

После не забываем нажать «submit»+«apply».

И переходим непосредственно к созданию этого скрипта. Открываем консоль сервера (ssh), авторизуемся и выполняем следующие команды:

# cd /var/lib/asterisk/agi-bin/
# nano realtime_transfer.sh

И уже далее содержимое в зависимости от настроек вашей АТС:

#!/usr/bin

Бессменный заголовок bash-скриптов

#YEAR=$1
#MONTH=$2
#DAY=$3
#CALLFILENAME=$4

Памятка по аргументом, поскольку обработка ведётся не по ассоциативному массиву, а по порядковому.

FILE=/var/spool/asterisk/monitor/$1/$2/$3/$4

Указание пути к директории хранения записей.

Внимание! На разных АТС он может быть разным. Например, при кластеризации или выносе папки записей «monitor» в примонтированный раздел и носитель. Так же возможны исключения в которых записи не градируются по директориям по дате вида «/год/месяц/день».

Для того чтобы сразу убедиться в  работоспособности и доступе к записям в скрипт внедрена проверка и логирование. Чуть позже вернёмся к этому моменту, а пока рассмотрим главный код:

# Конвертация и удаление оригинала
/usr/bin/lame -h -b 192 $FILE.wav $FILE.mp3 && /bin/rm -rf $FILE.wav

Как и гласит комментарий: первая команда силами приложения «lame» выполняет конвертацию из wav в mp3.

Внимание! Вторая команда должна быть обязательно соединена с первой двойным «&amp;&amp;» — это означает, что она выполнится только при успешном коде возврата первой. Формально оригинал wav будет удалён <strong>только</strong> при успешной конвертации и наличии mp3-файла. Если команды записать последовательно оригинал будет удалён вне зависимости от наличия копии в другом формате, что может привести к потере записи в принципе.
# Запрос учётки MySQL
mysqlpass="$(grep "AMPDBPASS" /etc/freepbx.conf | awk '{printf $3}' | sed  -e "s/['|;]//g")"
Внимание! Эта строка парсер используется только на дистрибутивах FreePBX, в которых есть файл /etc/freepbx.conf следующего вида:
<?php
$amp_conf['AMPDBUSER'] = 'freepbxuser';
$amp_conf['AMPDBPASS'] = '80**************50';
$amp_conf['AMPDBHOST'] = 'localhost';
$amp_conf['AMPDBNAME'] = 'asterisk';
$amp_conf['AMPDBENGINE'] = 'mysql';
$amp_conf['datasource'] = ''; //for sqlite3

require_once('/var/www/html/admin/bootstrap.php');
?>

В противном случае нужно указать пароль в переменной вручную.

mysqlpass=”ui************ahsh”

Далее нужно поправить ссылки на новый файл.

# Замена форматов
# CDR
querty="UPDATE cdr SET recordingfile=replace(recordingfile,\".wav\",\".mp3\") WHERE recordingfile=\"$4.wav\";"
mysql --user=freepbxuser --password="$mysqlpass"  asteriskcdrdb <<< "$querty"

Как и гласит комментарий, здесь производится замена формата в cdr таблице базы asteriskcdrdb.

Внимание! Если данная модификация проводится с целью обеспечить работу прослушивания записи через обратный звонок в панели, производить симметричную замену нужно ещё и в таблице PT1C_cdr в той же базе asteriskcdrdb. И не забыть переключить приложение воспроизведения записей: advanced settings.
# PT1C_cdr
querty="UPDATE PT1C_cdr SET recordingfile=replace(recordingfile,\".wav\",\".mp3\") WHERE recordingfile=\"$4.wav\";"
mysql --user=freepbxuser --password="$mysqlpass"  asteriskcdrdb <<< "$querty"

По готовности назначаем права на выполнения и меняем пользователя файла скрипта:

# chmod a+x /var/lib/asterisk/agi-bin/realtime_transfer.sh
# chown asterisk. /var/lib/asterisk/agi-bin/realtime_transfer.sh

Проверяем:

Права и принадлежность скрипта

Если картинка совпадает, значит всё сделано верно. Теперь можем проверить работу надстройки. Ставим в консоли папку с записями на мониторинг:

watch ls -l /var/spool/asterisk/monitor/2019/03/25/

И делаем вызов.

Демонстрация

После чего проверяем результат:

Физическое наличие файла
Ссылка на файл из CDR
Ссылки на файлы из PT1C_cdr

Как уже говорилось мониторить работу скрипта можно в реальном времени через файл лога:

tailf /var/log/asterisk/full | grep "Transfer"

И совершить или дождаться звонок. Результат следующего вида означает что «мгновенная конвертация» выполнена успешно:

Мониторинг через лог

Код скрипта целиком:

#!/bin/bash

#YEAR=$1
#MONTH=$2
#DAY=$3
#CALLFILENAME=$4

FILE=/var/spool/asterisk/monitor/$1/$2/$3/$4

# Проверка наличия файла
if [ -f "$FILE.wav" ]; then

        # Конвертация и удаление оригинала
        /usr/bin/lame -h -b 192 $FILE.wav $FILE.mp3 && /bin/rm -rf $FILE.wav

        # Запрос учётки MySQL
        mysqlpass="$(grep "AMPDBPASS" /etc/freepbx.conf | awk '{printf $3}' | sed  -e "s/['|;]//g")"

        # Замена форматов
        # CDR
        querty="UPDATE cdr SET recordingfile=replace(recordingfile,\".wav\",\".mp3\") WHERE recordingfile=\"$4.wav\";"
        mysql --user=freepbxuser --password="$mysqlpass"  asteriskcdrdb <<< "$querty"

        # PT1C_cdr
        querty="UPDATE PT1C_cdr SET recordingfile=replace(recordingfile,\".wav\",\".mp3\") WHERE recordingfile=\"$4.wav\";"
        mysql --user=freepbxuser --password="$mysqlpass"  asteriskcdrdb <<< "$querty"

        # Логирование действий
        /bin/echo "Transfer complete! Before: $FILE.wav,  after: $FILE.mp3" >> /var/log/asterisk/full

else

        # Логирование действий
        /bin/echo "Transfer failure! File not found!" >> /var/log/asterisk/full

fi

# !!! Перенести в Post Call Recording Script !!!
# /var/lib/asterisk/agi-bin/realtime_transfer.sh ^{YEAR} ^{MONTH} ^{DAY} ^{CALLFILENAME}
Телефонная книга CallMetrix
Корпоративный телефонный справочник для удобной связи между сотрудниками организации
Скачать описание CallMetrix
Подписаться
Уведомить о
guest
7 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Виктор
Виктор
18.01.2021 12:49

Чего то в вэбинтерфейсе mp3 не хочет воспроизводиться. Пришлось пока убрать конвертацию. freepbx 15

Дмитрий
Дмитрий
18.01.2021 12:56
Ответить на  Виктор

Здравствуйте. В большинстве случаев это происходит если наименование файла, в частности его расширение, в базе данных не соответствует действительности.

Виктор
Виктор
18.01.2021 17:34
Ответить на  Виктор

В итоге прописал пароль к БД фиксированно, без парсера. И всё заработало.

Николай
Николай
27.02.2021 01:28

Есть ощущение, что скрипт начинает выполнять замену до того как в таблице CDR появится обрабатываемая запись. Поэтому, не смотря на то, что файл сконвертировался, ссылка в БД по прежнему указывает на .wav. Также рекомендую для уменьшения объема занимаемого пространства в скрипте указывать не CD качество с битрейтом 192 а пресет phone. В итоге строка в указанном скрипте будет выглядеть так:

/usr/bin/lame --preset phone $FILE.wav $FILE.mp3 && /bin/rm -rf $FILE.wav
Последний раз редактировалось 3 лет назад Николай ем
Василий
Василий
02.04.2021 12:24

Добрый день. Спасибо большое за статью. Подскажите, как можно настроить конвертацию только не сразу после звонка, а ночью?

Последний раз редактировалось 3 лет назад Василий ем
Ирина Шавульская
Администратор
Ответить на  Василий

Можно, напишите скрипт по конвертации и положите его в crontab

Дмитрий
Дмитрий
26.08.2021 17:44

Здравствуйте!
Не подскажете, по какой причине может не выполняться «Скрипт обработки записи после вызова»? Фай не конвертируется и в логах о «Transfer…» ничего нет.
Spawn extension (ext-local, h, 1) exited non-zero on ‘SIP/Multifon-0000003e’
== MixMonitor close filestream (mixed)
== Executing [/etc/asterisk/scripts/mixmon-mp3-2.sh 2021 08 26 external-998-7926ххххххх-20210826-143104-1629988264.62]
== End MixMonitor Recording SIP/Multifon-0000003e
Это крайние строчки вызова

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.