Wednesday, February 20, 2013

Экзотика с кодеками или silk+amrnb в Asterisk

Возникла задачка гонять голос по 3G сетям. После долгих и не особенно продуктивных мучений были выбраны кодеки speex и g729, как кандидаты на релиз. amr-nb патч существовал для версии 1.8, у меня же по разным причинам используется 10ка.
Но выбравшись из консоли и взглянув на мир, выяснилось, что для 10ки можно использовать кодек silk, он же используется для Skype и с недавнего времени стал open-source. Плюс, добрый человек в Одессе сделал патч для поддержки amrnb в 10й версии Астериска.

Все собиралось и тестировалось на Asterisk 10.12.1, Debian 6.0 x64 (OpenVZ)

1. SILK
Собирался по мотивам https://github.com/mordak/codec_silk
К стандартному набору для компилирования необходимо добавить curl. Это для работы скрипта, но никто не мешает скачать все руками.

Из отличий - в install_silk.sh заменил 


ln -sf "SILK_SDK_SRC_FIX_v$SKYPE_SILK_VER" silk
на  ln -sf "SILK_SDK_SRC_FLP_v$SKYPE_SILK_VER" silk Почему-то версия с фиксированной точкой у меня собираться отказывалась.
Также в astdir/codecs/silk/Makefile заменить
CFLAGS  += -Wall -enable-threads -O3
на
CFLAGS  += -Wall -enable-threads -O3 -fPIC
После этого все как обычно собирается.
После инсталляции в файл /etc/asterisk/codecs.conf добавить

[silk8]
type=silk
samprate=8000
fec=true
packetloss_percentage=10
maxbitrate=20000
dtx=false

[silk12]
type=silk
samprate=12000
fec=true
packetloss_percentage=10
maxbitrate=25000
dtx=false

[silk16]
type=silk
samprate=16000
fec=true
packetloss_percentage=10
maxbitrate=30000
dtx=false

[silk24]
type=silk
samprate=24000
fec=true
packetloss_percentage=10
maxbitrate=40000
dtx=false

Ну и в консоли.: asterisk -rx "core restart now"
И да, я знаю o бинарниках от Digium, но это не путь истинного джедая. Плюс, тот же добрый человек из Одессы упрекает их в глючности и не верить ему у меня оснований нет.

2. AMR-NB
Качаем патч с этой странички. Единственное что, если silk не компилируется вручную, то падает 2й hunk при патче. Просто в /codecs/Makefile необходимо добавить строчку
$(if $(filter codec_amr,$(EMBEDDED_MODS)),modules.link,codec_amr.so): $(LIBAMR)
После этого разархивируем в папку /codecs/amr содержимое следующего архива.
Переходим в папку /codecs/amr

./configure CFLAGS = "-g -O2 -fPIC"
make

После этого все как обычно собирается.
После инсталляции в файл /etc/asterisk/codecs.conf добавить

[amr]
octet-aligned=0
;codec_amr: Must be one of MR475, MR515, MR59, MR67, MR74, MR795, MR102, MR122
mode = MR475
dtx=0
cng = 1
vad = 0

octet-aligned=0 - Это следствие того, что CSipSimple (точнее, pjsip) умеет  AMR только в Bandwidth-Efficient режиме. Что это такое, можно почитать в RFC.
Ну и в консоли.: asterisk -rx "core restart now"
Теперь по core show translation  можно увидеть, что у нас появился целый набор silk'ов и amr.

1 comment:

  1. Спасибо за информацию.
    Ставил по Вышей инструкции все стало, как положено, проверял кодэк с фиксированной точкой и с постоянной, ризница не заметна.
    Но вот в астериксе opus и silk заметная разница в пользу opus

    ReplyDelete