В этой статье рассмотрим как осуществить запись входящих разговоров в Asterisk 20+ в очередях без старого параметра membermacro.
Начиная с Asterisk 20, модуль app_macro.so был полностью удалён. Это означает, что старый параметр membermacro в очередях больше не работает. Вместо него нужно использовать membergosub и контексты с Gosub. В этой статье я покажу, как настроить запись входящих разговоров в MP3.
Что изменилось?
| Старые версии (Asterisk 16 и ниже) | Новые версии (Asterisk 20+) |
|---|---|
membermacro=record-answ |
membergosub=record-answ,s,1 |
Macro(record-answ) |
Gosub(record-answ,s,1) |
MacroExit() |
Return() |
Шаг 1: Установка необходимых пакетов
Для записи и конвертации аудио потребуется установить lame — консольный MP3-кодек.
apt update apt install lame -y
Также убедитесь, что в системе установлен сам Asterisk 20 или новее, а также модуль MixMonitor (обычно идёт в комплекте).
asterisk -V asterisk -rx "module show like MixMonitor"
Шаг 2: Создание скрипта конвертации WAV в MP3
Asterisk записывает разговоры в формате WAV (или SLIN). Чтобы экономить место и получать MP3-файлы, нужно после завершения звонка конвертировать запись.
Создайте скрипт /usr/local/bin/convert-wav-to-mp3.sh:
cat > /usr/local/bin/convert-wav-to-mp3.sh << 'EOF' #!/bin/bash # Скрипт конвертации WAV в MP3 с последующим удалением WAV WAV_FILE="$1" MP3_FILE="${WAV_FILE%.wav}.mp3" # Небольшая пауза, чтобы файл точно освободился sleep 1 # Конвертируем, если файл существует if [ -f "$WAV_FILE" ]; then /usr/bin/lame --preset standard "$WAV_FILE" "$MP3_FILE" && rm -f "$WAV_FILE" fi EOF chmod +x /usr/local/bin/convert-wav-to-mp3.sh
Что здесь происходит:
-
--preset standard— качество MP3 (можно заменить на--preset voiceдля речи) -
sleep 1— задержка, чтобы MixMonitor успел завершить запись -
&& rm -f— удаляет WAV только после успешной конвертации
Шаг 3: Создание контекста записи в extensions.conf
В файл /etc/asterisk/extensions.conf добавьте следующий контекст:
[record-answ] exten => s,1,NoOp(=== Запуск записи разговора ===) same => n,Set(LIMIT_PLAYAUDIO_CALLER=yes) same => n,Set(LIMIT_PLAYAUDIO_CALLEE=yes) same => n,Playback(/usr/local/etc/asterisk/ivr/rec_ru) ; Предупреждение о записи ; Формируем имя файла: дата_время_IDзвонка_номерзвонящего.mp3 same => n,Set(REC_DATE=${STRFTIME(${EPOCH},,%Y%m%d_%H%M%S)}) same => n,Set(REC_PREFIX=${REC_DATE}_${UNIQUEID}_${CALLERID(num)}) same => n,Set(WAV_FILE=/home/records/${REC_PREFIX}.wav) ; Запускаем запись с автоматической конвертацией после звонка same => n,MixMonitor(${WAV_FILE},b,/usr/local/bin/convert-wav-to-mp3.sh ${WAV_FILE}) same => n,Return()
Пояснение параметров MixMonitor:
-
Первый аргумент — путь к WAV-файлу
-
b— запустить пост-процессор в фоне (не дожидаясь завершения) -
Третий аргумент — скрипт конвертации
Шаг 4: Настройка очереди в queues.conf
В файле /etc/asterisk/queues.conf найдите нужную очередь и измените (или добавьте) параметр:
[inbox4] musicclass = default strategy = wrandom timeout = 7 setinterfacevar=yes context = office_rules joinempty=no leavewhenempty=yes membergosub=record-answ,s,1 ; Вместо старого membermacro member=>Local/123@minsk-sip
Важно: параметр membergosub указывает на контекст и экстеншен, который будет вызван при подключении оператора к звонящему.
Шаг 5: Создание директории для записей
Создайте папку, где будут храниться записи, и назначьте права для пользователя Asterisk:
mkdir -p /home/records chown asterisk:asterisk /home/records chmod 750 /home/records
Шаг 6: Перезагрузка конфигурации
После всех изменений нужно применить их в Asterisk:
# Перезагружаем конфиги очередей asterisk -rx "queue reload all" # Перезагружаем диалплан asterisk -rx "dialplan reload" # Проверяем, что очередь использует membergosub asterisk -rx "queue show inbox4" # Проверяем синтаксис контекста asterisk -rx "dialplan show record-answ"
Проверка работы
-
Позвоните в очередь
-
Дождитесь соединения с оператором
-
После разговора проверьте наличие файла в
/home/records/:
ls -la /home/records/
Вы должны увидеть файл с именем типа 20250528_143022_1234567890.0_1234567890.mp3
Дополнительные советы
Ротация записей
Чтобы записи не заполнили весь диск, добавьте задачу в cron:
cat > /etc/cron.daily/clean-records << 'EOF' #!/bin/bash # Удаляем записи старше 90 дней find /home/records -name "*.mp3" -mtime +90 -delete EOF chmod +x /etc/cron.daily/clean-records
Настройка качества записи
В файле /etc/asterisk/asterisk.conf можно указать формат записи по умолчанию:
[options] ; Формат записи (wav, slin, gsm) internal_timing = yes ; Максимальная длина файла (в секундах) maxfilesize = 2G
Альтернативный способ (без внешнего скрипта)
Если не хотите использовать bash-скрипт, можно запускать конвертацию через System():
same => n,MixMonitor(${WAV_FILE}) same => n,System(/usr/bin/lame --preset standard ${WAV_FILE} ${MP3_FILE} && rm -f ${WAV_FILE})
Но этот способ менее надёжен, так как может запустить конвертацию до завершения записи.
Заключение
Миграция с membermacro на membergosub — обязательное условие для работы Asterisk 20 и новее. Описанная схема позволяет:
-
Записывать входящие разговоры из очередей
-
Конвертировать записи в MP3
-
Хранить файлы с удобной структурой имён
-
Экономить дисковое пространство
Главное изменение — замена membermacro=record-answ на membergosub=record-answ,s,1 и создание соответствующего контекста с Gosub/Return вместо Macro/MacroExit.

