CentOS 7.6 minimal版安装最新版freeswitch 1.10.5

1.安装freeswitch (请先安装yum install net-tools,确定IP地址)

yum install -y https://files.freeswitch.org/repo/yum/centos-release/freeswitch-release-repo-0-1.noarch.rpm epel-release

yum-builddep -y freeswitch
yum install -y yum-plugin-ovl centos-release-scl rpmdevtools yum-utils git

yum -y install gcc gcc-c++ autoconf automake make
yum install libtool
yum install spandsp3-devel
yum install sofia-sip-devel
yum install zlib
yum install zlib-devel
yum install sqlite-devel
yum install libcurl-devel
yum install pcre
yum install pcre-devel
yum install speex
yum install speex-devel
yum install ldns-devel libidn-devel unbound-devel
yum install libedit-devel
yum install erlang
yum install yasm
yum install libavformat-dev
yum install -y libatomic
yum install centos-release-scl
yum install scl-utils scl-utils-build


scl enable devtoolset-4 'bash'



cd /usr/local/src

git clone -b v1.10 https://github.com/signalwire/freeswitch.git freeswitch

cd /usr/local/src/freeswitch

./bootstrap.sh -j

在执行make的时候会报错,再继续执行下面步骤。

 2.关闭防火墙

1,查看防火墙状态:systemctl status firewalld.service

2,关闭防火墙:systemctl stop firewalld.service

3,禁止开机启动:systemctl disable firewalld.service

3.安装libav

错误提示: You must install libav-dev to build mod_av

或者 : You must install libavformat-dev to build mod_av

安装nasm

wget http://www.nasm.us/pub/nasm/releasebuilds/2.13.03/nasm-2.13.03.tar.xz
tar -xvJf nasm-2.13.03.tar.xz
cd nasm-2.13.03
sed -e '/seg_init/d' \
-e 's/pure_func seg_alloc/seg_alloc/' \
-i include/nasmlib.h
./configure --prefix=/usr &&
make
make install
安装x264

wget ftp://ftp.videolan.org/pub/x264/snapshots/x264-snapshot-20180730-2245-stable.tar.bz2
tar xvf x264-snapshot-20180730-2245-stable.tar.bz2
cd /usr/local/src/x264-snapshot-20180730-2245-stable
make clean && make distclean
./configure --prefix=/usr --enable-shared
make && make install
ldconfig
cp /usr/lib/pkgconfig/x2* /usr/lib64/pkgconfig
安装libav

>wget https://libav.org/releases/libav-12.3.tar.gz
>tar -zxvf libav-12.3.tar.gz
>./configure --enable-shared --enable-libx264 --enable-gpl 
>make
>make install
>sudo ldconfig
>export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}

libav在make的时候可能会碰到下面的错误

需要修改源码解决错误:

libav编译时出错:
libavcodec/libx264.c: In function ‘X264_frame’:
libavcodec/libx264.c:246:9: error: ‘x264_bit_depth’ undeclared (first use in this function)
if (x264_bit_depth > 8)
^
libavcodec/libx264.c:246:9: note: each undeclared identifier is reported only once for each function it appears in
libavcodec/libx264.c: In function ‘X264_init_static’:
libavcodec/libx264.c:707:9: error: ‘x264_bit_depth’ undeclared (first use in this function)
if (x264_bit_depth == 8)
vim libavcodec/libx264.c

static av_cold void X264_init_static(AVCodec *codec)
 {
-    if (x264_bit_depth == 8)
+    if (X264_BIT_DEPTH == 8)
         codec->pix_fmts = pix_fmts_8bit;
-    else if (x264_bit_depth == 9)
+    else if (X264_BIT_DEPTH == 9)
         codec->pix_fmts = pix_fmts_9bit;
-    else if (x264_bit_depth == 10)
+    else if (X264_BIT_DEPTH == 10)
         codec->pix_fmts = pix_fmts_10bit;
}

4.最后安装细节

>yum install lua-devel

>yum -y install opus-devel

安装opus

https://www.opus-codec.org/downloads/
tar xf opus-1.3.1.tar.gz
cd opus-1.3.1
BUILD_LIBS=${HOME}/build_libs
./configure --prefix=${BUILD_LIBS} --with-pic --enable-float-approx
 
make
 
make install

安装pgsql

yum install postgresql-devel

yum install libks

安装cmake

wget https://cmake.org/files/v3.17/cmake-3.17.0.tar.gz
解压
tar -zxvf cmake-3.17.0.tar.gz
cd cmake-3.17.0
编译
./bootstrap
gmake
make install

 yum install libsndfile-devel

yum -y install unixODBC-devel

安装signalw

cd freeswitch/
git clone https://github.com/signalwire/signalwire-c.git
cd signalwire-c/
cmake .
make && make install
ln -sf /usr/local/lib64/pkgconfig/signalwire_client.pc /usr/lib64/pkgconfig/signalwire_client.p
yum -y install signalwire-client-c


>export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig:${PKG_CONFIG_PATH}
安装完成,如果 make 还是 提示这个错误,重新执行:另外还有一行使用了变量x264_bit_depth,也要替换成X264_BIT_DEPTH

>ldconfig

cd /usr/local/src/freeswitch

>./bootstrap.sh -j

>./configure --enable-portable-binary --prefix=/usr --localstatedir=/var --sysconfdir=/etc --with-gnu-ld --with-python --with-erlang --with-openssl --enable-core-odbc-support --enable-zrtp --enable-core-pgsql-support

>make

make成功后的标志

>make -j install

>make -j cd-sounds-install(如果执行报错,请单独敲命令,可能字符发生了错误

>make -j cd-moh-install

4.启动freeswitch

安装完后分别在user/share/freeswitch安装有相关sounds,scripts目录,

/etc/freeswitch/相关配置文件

/var/log/freeswitch相关日志文件

# 修改监听端口解决方法

vim /usr/local/freeswitch/conf/autoload_configs/event_socket.conf.xml

<param name="listen-ip" value="::"/>  改为 <param name="listen-ip" value="0.0.0.0"/>

#>freeswitch -nc -rp

# 进入命令

fs_cli

5.优化参数

1.不用等待10秒响应

安装完freeswitch发现进行sip呼叫的时候出现差不多延时10秒左右才能接受到信息 主要原因是freeswitch在FreeSWITCH\conf\dialplan\default.xml 中配置了延时时间 只需要注释掉就能解决这个问题,位置如下:

 <condition field="${default_password}" expression="^1234$" break="never">
    <action application="log" data="CRIT WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING "/>
    <action application="log" data="CRIT Open $${conf_dir}/vars.xml and change the default_password."/>
    <action application="log" data="CRIT Once changed type 'reloadxml' at the console."/>
    <action application="log" data="CRIT WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING "/>
    <!--<action application="sleep" data="10000"/>   注释掉-->
      </condition>

5.2支持中文语音

1、下载中文语音包  

链接:https://pan.baidu.com/s/1UODvqj8NAQw7_CRatfl0kg
提取码:qwdn

创建目录 /usr/share/freeswitch/sounds/zh/cn/link
将下载好的语音上传到     /usr/share/freeswitch/sounds/zh/cn/link

2、修改   /etc/freeswitch/vars.xml

  在53行左右增加 <X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/zh/cn/link"/>

3、修改  /etc/freeswitch/conf/autoload_configs/modules.conf.xml

  在136 行左右 取消 <load module="mod_say_zh"/> 注释 

4、编译mod_say_zh 模块  

  cd /usr/local/src/freeswitch/src/mod/say/mod_say_zh

        make && make install

5、cd /etc/freeswitch/lang/

  cp -fr en zh

  cd zh

  mv en.xml zh.xml

6、修改zh.xml
  <language name="zh" say-module="zh" sound-prefix="$${sound_prefix}/zh/cn/link" tts-engine="mod_tts_commandline" tts-voice="link">
7、/etc/freeswitch/freeswitch.xml
  在61行增加   <X-PRE-PROCESS cmd="include" data="lang/zh/*.xml"/>
8、控制台 reloadxml

9.本次代码来自https://www.cnblogs.com/xdcr/p/10207141.html
或者参考https://www.cnblogs.com/lzpong/p/6740188.html#autoid-0-2-1

10.如果出现加载文件错误的问题,请将$${sounds_dir}直接改成直接路径

5.3一些警告

WARNING] switch core file. c: 229 File has 2 channels, muxing to mono will occur

        这条信息表示,该文件有两个声道,但 playback仅是对一个 Channel I而言的,它仅支持一个声道。因而, FREESWITCH会先将两个声道混音,变成一个声道后再播放。该警告一般是无害的。只是,由于在播放时会进行混音,会多占用一些CPU,因而在高并发的场合,可以使用一些工具事先将声音文件混为一个声道。如我们可以使用sox命令行进行混音:

5.4使用pgsql(官方推荐使用postgresql)

安装pgsql的docker compose配置如下:

db:
  container_name: pgsql #生成的容器名称 
  restart: always
  image: postgres:9.6.20 #postgres 镜像
  privileged: true  #解决权限
  ports:
    - 5432:5432  #映射端口号
  environment:
    POSTGRES_PASSWORD: 123456  #密码
    PGDATA: /var/lib/postgresql/data/pgdata #数据存储文件夹
  volumes:
    - /opt/pgsql/data/pgdata:/var/lib/postgresql/data/pgdata #将数据映射到对应的路径
1.yum install libpq-devel
编辑/usr/local/src/freeswitch/modules.conf
2.开启event_handlers/mod_cdr_pg_csv
3.关闭event_handlers/mod_cdr_pg_csv

4.在fs源码目录下面 运行

make mod_cdr_pg_csv-install
将/usr/local/freeswitch/mod/下面的.so和la文件拷贝到/usr/lib/freeswitch/mod目录

5.使用docker安装pgsql9.6.20,创建freeswitch用户并授权
postgreSQL 创建用户并授权

使用navicat超级用户登录数据库
创建freeswitch数据库,utf8编码
然后执行
CREATE USER freeswitch WITH PASSWORD '123456';
这时就创建了用户 freeswitch 
GRANT ALL PRIVILEGES ON DATABASE freeswitch TO freeswitch;
将数据库 freeswitch 权限授权于 freeswitch 
但此时用户还是没有读写权限,需要继续授权表
GRANT ALL PRIVILEGES ON all tables in schema public TO freeswitch;
注意,该sql语句必须在所要操作的数据库里执行
这一句是将当前数据库下 public schema 的表都授权于 freeswitch


6.vim /etc/freeswitch/autoload_configs/switch.conf.xml

<param name="core-db-dsn" value="pgsql://host=localhost dbname=freeswitch user=freeswitch password='password' options='-c client_min_messages=NOTICE' application_name='freeswitch'" />
 
7.autoload_configs/cdr_pg_csv.conf.xml

<param name="db-info" value="host=localhost user=freeswitch password=nopassword dbname=freeswitch connect_timeout=10" />
8.在var.xml追加以下配置,然后去注释db.conf.xml、voicemail.conf.xml、internal.xml、external.xml、fifo.conf.xml、callcenter.conf.xml 中的" <param name="odbc-dsn" value="$${dsn}"/>"
<X-PRE-PROCESS cmd="set" data="dsn=pgsql://hostaddr=127.0.0.1 dbname=freeswitch user=freeswitch password='password' options='-c client_min_messages=NOTICE' application_name='freeswitch'" />
<X-PRE-PROCESS cmd="set" data="dsn_callcenter=pgsql://hostaddr=127.0.0.1 dbname=freeswitch user=freeswitch password='password' options='-c client_min_messages=NOTICE' application_name='freeswitch'" /> 

8.【附】xml_cdr建表sql及cdr_pg_csv.conf.xml 字段设置

 

CREATE TABLE "public"."xml_cdr" (
"uuid" uuid NOT NULL,
"domain_uuid" uuid,
"extension_uuid" uuid,
"domain_name" text COLLATE "default",
"accountcode" text COLLATE "default",
"direction" text COLLATE "default",
"default_language" text COLLATE "default",
"context" text COLLATE "default",
"xml_cd" text COLLATE "default",
"json" jsonb,
"caller_id_name" text COLLATE "default",
"caller_id_number" text COLLATE "default",
"source_number" text COLLATE "default",
"destination_number" text COLLATE "default",
"start_epoch" numeric,
"start_stamp" timestamp(6),
"answer_stamp" timestamp(6),
"answer_epoch" numeric,
"end_epoch" numeric,
"end_stamp" text COLLATE "default",
"duration" numeric,
"mduration" numeric,
"billsec" numeric,
"billmsec" numeric,
"bridge_uuid" text COLLATE "default",
"read_codec" text COLLATE "default",
"read_rate" text COLLATE "default",
"write_codec" text COLLATE "default",
"write_rate" text COLLATE "default",
"remote_media_ip" text COLLATE "default",
"network_addr" text COLLATE "default",
"recording_file" text COLLATE "default",
"leg" char(1) COLLATE "default",
"pdd_ms" numeric,
"rtp_audio_in_mos" numeric,
"last_app" text COLLATE "default",
"last_arg" text COLLATE "default",
"cc_side" text COLLATE "default",
"cc_member_uuid" uuid,
"cc_queue_joined_epoch" text COLLATE "default",
"cc_queue" text COLLATE "default",
"cc_member_session_uuid" uuid,
"cc_agent" text COLLATE "default",
"cc_agent_type" text COLLATE "default",
"waitsec" numeric,
"conference_name" text COLLATE "default",
"conference_uuid" uuid,
"conference_member_id" text COLLATE "default",
"digits_dialed" text COLLATE "default",
"pin_number" text COLLATE "default",
"hangup_cause" text COLLATE "default",
"hangup_cause_q850" numeric,
"sip_hangup_disposition" text COLLATE "default",
CONSTRAINT "xml_cdr_pkey" PRIMARY KEY ("uuid")
)
WITH (OIDS=FALSE)
;
ALTER TABLE "public"."xml_cdr" OWNER TO "freeswitch";
</settings>
  <schema>
    <field var="uuid"/>
    <field var="domain_uuid"/>
    <field var="domain_name"/>
    <field var="accountcode"/>
    <field var="direction"/>
    <field var="default_language"/>
    <field var="context"/>
    <field var="xml_cdr"/>
    <!-- <field var="local_ip_v4"/> -->
    <field var="caller_id_name"/>
    <field var="caller_id_number"/>
    <field var="destination_number"/>
    <field var="start_epoch"/>
    <field var="start_stamp"/>
    <field var="answer_stamp"/>
    <field var="answer_epoch"/>
    <field var="end_epoch"/>
    <field var="end_stamp"/>
    <field var="duration"/>
    <field var="mduration"/>
    <field var="billsec"/>
    <field var="billmsec"/>
    <field var="bridge_uuid"/>
    <!-- <field var="bleg_uuid"/> -->
    <field var="read_codec"/>
    <field var="read_rate"/>
    <field var="write_codec"/>
    <field var="write_rate"/>
    <field var="remote_media_ip"/>
    <field var="network_addr"/>
    <field var="recording_file"/>
    <field var="leg"/>
    <field var="pdd_ms"/>
    <field var="last_app"/>
    <field var="last_arg"/>
    <field var="cc_side"/>
    <field var="cc_member_uuid"/>
    <field var="cc_queue_joined_epoch"/>
    <field var="cc_queue"/>
    <field var="cc_member_session_uuid"/>
    <field var="cc_agent"/>
    <field var="cc_agent_type"/>
    <field var="waitsec"/>
    <field var="conference_name"/>
    <field var="conference_uuid"/>
    <field var="conference_member_id"/>
    <field var="digits_dialed"/>
    <field var="hangup_cause"/>
    <field var="hangup_cause_q850"/>
    <field var="sip_hangup_disposition"/>
    <!-- <field var="sip_hangup_disposition"/> -->
    <!-- <field var="ani"/> -->
  </schema>
 

【附】录音文件路径写入数据库:

dialpanl/default.xml中添加一行,定义录音文件路径

<action application="bind_meta_app" data="1 b s execute_extension::dx XML features"/>
<action application="bind_meta_app" data="2 b s record_session::$${recordings_dir}/${caller_id_number}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
<action application="bind_meta_app" data="3 b s execute_extension::cf XML features"/>
<action application="bind_meta_app" data="4 b s execute_extension::att_xfer XML features"/>
<action application="set" data="recording_file=$${recordings_dir}/${caller_id_number}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
再在autoload_configs/cdr_pg_csv.conf.xml的字段定义中添加一行
<field var="recording_file"/>
最后在数据库表中添加一个字段
recording_file

重新加载模块reload mod_cdr_pg_csv
再打电话就有录音路径生成了
以上部分来自:https://blog.51cto.com/908405/1950318



猜你喜欢

转载自blog.csdn.net/penker_zhao/article/details/110004084