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