В данной статье я дам небольшое описание как сохранять записи разговоров в формате mp3 но с расширением .wav, тем самым уменьшив размер файлов и сохранив возможность прослушивать файлы из панели управления (имена файлов не будут меняться). А также дам пару советов, как уменьшить нагрузку на дисковую подсистему, избавившись от лишних логов (при нагруженной системе уменьшение нагрузки достаточно заметно).

В старых версиях файлы записей хранились по умолчанию в одной папке, создавая тем самым проблемы при их большом количестве. В Elastix 2.5 перешли на FreeBPX 2.11, а там, как известно, записи телефонных разговоров раскладываются по папкам на каждый день.
Соответственно изменились (добавились) переменные для использования со скриптом конвертации записей после звонка.

Причем, в старых версиях, добавить параметр “Run after record” можно было прямо через панель управления Elastix, в разделе “General Settings”. В новой версии, для того чтобы добавить это параметр (кстати, параметр тоже поменял название — “Post Call Recording Script”), нужно воспользоваться панелью управления FreePBX.

Итак, в чем суть: мы будем конвертировать файл после разговора в формат mp3 с помощью lame, потом, с помощью ffmpeg мы добавим заголовок к файлу записи и сменим расширение обратно на .wav. В итоге все останется для самой системы неизменным, однако существенно уменьшится размер хранимых файлов, по моей оценке в 7-10 раз.

В первую очередь необходимо установить в систему пакеты ffрmpeg и lame:
# rpm -Uhv http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm
# yum --disablerepo=commercial-addons install ffmpeg lame


Параметр --disablerepo=commercial-addons необходим потому что, в репозитории commercial-addons присутствует пакет ffmpeg, который нам не подходит.

Создаем папку для нашего скрипта:
# mkdir -p /etc/asterisk/scripts; chown asterisk. /etc/asterisk/scripts


Забираем скрипт с github:
# wget https://raw.githubusercontent.com/andrey0001/fpbx-elastix/master/mixmon-mp3-2.sh -O /etc/asterisk/scripts/mixmon-mp3-2.sh


Устанавливаем права на файл
# chown asterisk. /etc/asterisk/scripts/mixmon-mp3-2.sh
# chmod a+x /etc/asterisk/scripts/mixmon-mp3-2.sh


Сам репозиторий на github.

Выполняем команду visudo и добавляем в конец файла:
asterisk ALL = NOPASSWD: /bin/nice
asterisk ALL = NOPASSWD: /usr/bin/ionice
asterisk ALL = NOPASSWD: /bin/chown

asterisk ALL = NOPASSWD: /bin/chmod
asterisk ALL = NOPASSWD: /bin/rm
asterisk ALL = NOPASSWD: /bin/touch


Вот теперь, мы выполнили все необходимые действия в консоли, и можем спокойно переходить к панели управления FreePBX:
Идем в раздел “Settings -> Advanced Settings” и включаем 2 параметра (Display Readonly Settings, Override Readonly Settings)


Применяем изменения. У нас теперь появилась возможность редактировать дополнительные параметры.
В параметр “Post Call Recording Script” вставляем значение:

/etc/asterisk/scripts/mixmon-mp3-2.sh ^{YEAR} ^{MONTH} ^{DAY} ^{CALLFILENAME} ^{MIXMON_FORMAT} ^{MIXMON_DIR}

В параметр “Override Call Recording Location” вставляем значение:

/var/spool/asterisk/monitor/


Применяем все изменения.
Всё, теперь все записи телефонных разговоров, после разговора, будут конвертированы в формат mp3, с сохранением расширения .wav.

Для старых версий файл скрипта mixmon-mp3.sh, а парамерт “Run after record”:

/etc/asterisk/scripts/mixmon-mp3.sh ^{MIXMON_DIR} ^{CALLFILENAME} ^{MIXMON_FORMAT}


И еще, перед тем как Вы включите это всё, несомненно вы захотите конвертировать уже имеющиеся у вас записи телефонных разговоров. Для этого, файл скрипта conv.sh и запускаем команду из консоли:
find /var/spool/asterisk/monitor/ -name '*.wav' -exec ./conv.sh {} \;

Процесс не быстрый.

Теперь, когда вы будете прослушивать файлы записей, формат будет mp3 — обратите внимание на картинку:


Что касается логов:
По умолчанию, Elastix пишет полные логи, и складывает CDR аж в три места (mysql, sqlite и файл csv):
/etc/asterisk/logger.conf и ему сопутствуюшие, оставьте только:
console => notice,warning,error
/etc/asterisk/cdr.conf и ему сопутствуюшие, оставьте только запись в mysql.

Вот и всё!

Удачи в настройках.

UPD: по комменту, убрал sudo из скрипта. Добавлять через visudo достаточно nice, ionice и chown

Комментарии (23)


  1. fleaump
    23.05.2015 12:16

    А чем по крону не устраивает делать то же самое? По ночам конвертить спокойно и складывать куда надо.

    И прав не надо давать, лишняя лазейка же, тем более права даются на такое как chown chmod, что равно сильно простому запуску под рутом по возможностям.


    1. shadowalone Автор
      23.05.2015 16:40

      В том то и дело, что многие делают по крону.
      Кого то устраивает. Но, во первых, есть сервисы, которые и по ночам принимают звонки. Во вторых, в данном случае, запись разговора готова сразу, и не на следующий день.


  1. ValdikSS
    23.05.2015 13:10

    Лучше бы OPUS использовали, он гораздо сильнее понизил бы битрейт для голоса, без слышимых артефактов.


    1. shadowalone Автор
      23.05.2015 16:42

      тогда встанет вопрос — чем слушать opus. А mp3 поддерживает любой плеер.


      1. ValdikSS
        23.05.2015 21:44

        OPUS поддерживается во многих аудиопроигрывателях и почти во всех популярных браузерах.


        1. shadowalone Автор
          23.05.2015 21:55

          ключевое слово «почти».
          Если бы использовался OPUS, то в названии статьи было бы OPUS.
          Как Вы могли прочесть, в названии нет ни слова про opus. Это говорит о том, что о нем рассуждать неуместно. Когда буду использовать opus? напишу про opus — надеюсь ответ ясен.

          В своё время, когда появился OPUS, его представляли как «убийцу mp3», прошло время, и как видим, этого не случилось.

          А что касается поддержки opus в VoIP — смею Вас уверить, огромное количество железок его не поддерживает до сих пор, причем это не SOHO, а промышленные решения. А если брать в расчет софтовые решения, не все бросились обновлять отлаженную систему для поддержка данного кодека. И еще один существенный минус, вытекающий из этого, это то, что конечные решения (телефонные аппараты), в большинстве своём не поддерживают opus, а это ведет к лишнему транскодированию, что чревато лишней нагрузкой.


          1. ValdikSS
            23.05.2015 22:01

            Вы, в целом, правы: MP3 будет еще долго использоваться для музыки, т.к. при 320 кбит/с он не так уж и плох, но при низких битрейтах подчистую проигрывает практически всему (OPUS, Vorbis, AAC). Если даже AAC не сказать, чтобы прямо повсеместно используется, то OPUS до этого еще дальше.
            Про железо и VoIP вы опять правы, но поддержка OPUS есть в софтофонах, и он обеспечивает отличное качество речи при 20 кбит/с. Если вы транскодируете PCM в MP3 только для архива, то, по моему мнению, OPUS тут подошел бы больше, чем MP3.

            В качестве примера, послушайте 48 кбит/с MP3 и 48 кбит/с OPUS.


            1. shadowalone Автор
              23.05.2015 22:09

              Поверьте мне, по роду своей деятельности, я достаточно осведомлен о кодеках, и opus в том числе.
              Но, в контексте данной статьи:
              1. opus-tools нет в растпространенных репах
              2. не факт, что накинув заголовок и поменяв расширение на .wav это съедят плееры.

              Что касается прослушки для сравнения, давайте оставим это меломанам. Тем более, здесь речь идет о записи телефонного разговора, в котором качество и так оставляет желать лучшего.
              И самое главное, если в данном примере, заменить mp3 на opus, то не думаю что размеры файлов будут отличаться более чем на 1-2%.
              Тут главная задача была, уменьшить размер. И не создать геморой уменьшив размер еще чуть больше.


  1. Hellsy22
    23.05.2015 18:57

    А почему бы не дать право за запуск от рута конкретного скрипта, а в нем уже понижать права там, где это зачем-то нужно?
    Тогда ему можно будет с чистой совестью выставить права типа 700. По-моему, это будет безопаснее, чем выдавать рутовые права на chmod, chown и rm.


    1. shadowalone Автор
      23.05.2015 19:15

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


    1. shadowalone Автор
      23.05.2015 19:20

      Поправил скрипт, добавил UPD.


      1. shadowalone Автор
        23.05.2015 19:42

        Если вам не обязательно использовать nice и ionice, тогда вообще можно обойтись без sudo.
        если процессор многоядерный, то можно обойтись без nice, так как lame использует только одно ядро, а ffmpeg вообще не грузит, так как не перекодирует.


      1. Hellsy22
        24.05.2015 09:00

        Я имел в виду нечто иное. Частичный отказ от sudo — это хорошо, но у вас, к примеру, у пользователя есть рутовый chown, а значит, по сути, есть и полный рутовый доступ. Я же предлагаю разрешить в sudoers запускать от рута только определенный скрипт, в котором вы пропишете все необходимые действия и который, разумеется, не будет доступен для редактирования пользователю asterix.


        1. shadowalone Автор
          24.05.2015 15:42

          если не использовать ionice, то sudo можно убрать совсем.
          ну и Ваш вариант совсем не плох.
          Или, как вариант, для chown сделать в sudoers:
          asterisk ALL = NOPASSWD: /bin/chown asterisk. /var/spool/asterisk/monitor/*


  1. solalex
    25.05.2015 10:51

    Сделал по инструкции, но для FreePBX 12.0.57 (CentOS 6.5 x64)
    rpmforge установил для своей версии, но почему-то не устанавливалось с опцией --disablerepo=commercial-addons

    [root@pbx ~]# rpm -Uhv pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
    Retrieving pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
    Preparing… ########################################### [100%]
    1:rpmforge-release ########################################### [100%]
    [root@pbx ~]# yum --disablerepo=commercial-addons install ffmpeg lame
    Loaded plugins: fastestmirror, kmod

    Error getting repository data for commercial-addons, repository not found

    вобщем установил ffmpeg по тупому — yum install ffmpeg lame
    в принципе скрипт работает, конвертирует.
    Подскажите, как модифицировать скрипт, чтобы он нормализовал уровень звука?


  1. shadowalone Автор
    25.05.2015 12:52

    Возможно во FreePBX 12 другие репы.
    Подредактируйте строку с lame, чтоб сделать нормализацию.


    1. solalex
      25.05.2015 13:59

      кстати перестали воспроизводиться записи из веб-интерфейса UCP, ошибка «Media URL could not be loaded.» Вероятно из-за переименовывания исходных файлов. Приходится скачивать и слушать.


      1. shadowalone Автор
        25.05.2015 18:29

        это да, это уже надо править в коде панели freepbx.


        1. solalex
          25.05.2015 18:54

          хотелось бы конкретики


          1. shadowalone Автор
            25.05.2015 18:58

            Не понял? что значит «хотелось бы конкретики»?
            Ищите на предмет «Content-Type» для отдаваемых файлов записи, и меняйте.


            1. solalex
              25.05.2015 19:12
              -1

              Я хочу чтоб у меня не ломался заложеный функционал freepbx, т.е. воспроизводились файлы из веб-интерфейса. Если вы делаете tutorial, то напишите полные действия, а не то, что вы описываете общими фразами.

              Ищите на предмет «Content-Type» для отдаваемых файлов записи, и меняйте.

              Где искать? Что искать? На что менять?


              1. shadowalone Автор
                25.05.2015 19:56

                Понятия не имею что Вам надо искать.
                Почитайте заголовок, где черным по белому написано 2.11. Там нет ни слова про FreePBX 12.
                Туториал — это не значит, что подойдет каждому. Это значит только то, что в нём написано, а не то, что Вам хочется.
                Может быть, если бы у Вас стояло 2.11, я бы еще мог посмотреть и подсказать.
                А так, попробуйте решить сами, а потом отпишитесь об этом — будет польза.


                1. solalex
                  25.05.2015 21:33

                  Разобрался, оказывается зависит от браузера. В Фаерфоксе воспроизведение «поломалось», но в Хроме воспроизводится нормально. Извините за назойливость.