FreeSwitch编译

0 引子

之前在CentOS 7.2上安装的FreeSwitch是从官方的RPM源上直接拉下来的,虽然能够正常使用,但是因为我们需要对FreeSwitch的某些模块进行修改,因此最终还是需要手动编译安装。

在我第一次的编译过程中出现了很多坑,因此记录一下,以备将来使用。

环境:

  1. 系统:CentOS7.9
  2. GCC:9
  3. FreeSwitch:1.8.7
  4. ffmpeg:3.4.9
  5. nginx:1.25.2(当前最新)

为了展示排错的流程,我就先从FreeSwitch开始,经过FFmpeg,最后是Nginx。

其中FFmpeg中的libavformat和libswscale两个库是FreeSwitch中mod_av所依赖的,而使用FFmpeg进行视频推流的测试则需要Nginx搭建一个简单的rtmp服务器。

1 编译FreeSwitch

这个里面的教程有点老,但是不至于用不了

https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Installation/Linux/CentOS-7-and-RHEL-7_10289546/

1.1 在signalwire.com生成一个token

### 1.2 通过signalwire源下载一些依赖

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 初始化一些环境变量
echo "signalwire" > /etc/yum/vars/signalwireusername
echo "TOKEN" > /etc/yum/vars/signalwiretoken

# 添加官方推荐的源
yum install -y https://$(< /etc/yum/vars/signalwireusername):$(< /etc/yum/vars/signalwiretoken)@freeswitch.signalwire.com/repo/yum/centos-release/freeswitch-release-repo-0-1.noarch.rpm epel-release centos-release-scl

# 更新源数据
yum update

# 安装编译所需工具
yum install yum-utils yum-plugin-ovl rpmdevtools git

# 这一步的时候应该会出现一个spandsp和spandsp3的冲突,我选择的是安装spandsp3,所以使用这个命令先跳过冲突
yum-builddep -y freeswitch --skip-broken
yum remove -y spandsp
yum install -y spandsp3-devel

# 安装GCC
yum install -y devtoolset-9-gcc*
scl enable devtoolset-9 'bash'

1.3 下载源码

1
2
3
4
cd ~ 
git clone https://github.com/signalwire/freeswitch.git
cd freeswitch
git checkout v1.8.7

1.4 编译以及撞墙

如果在编译前你的环境流没有ffmpeg相关的东西的话,建议先看[第二节](# 2 编译FFmpeg),等到装完ffmpeg和相关库之后再回来看,具体原因我会在下面解释。

1
2
3
4
5
6
7
8
cd ~/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
            
make -j

我在执行到make这个地方的时候遇到了这么一个问题:

error You must install libavformat-dev and libswscale-dev to build mod_av

这是因为没有mod_av所需要的libavformat和libswscale导致的,这两个都是可以通过安装ffmpeg解决的。

但是现在CentOS7真的是太古旧了,根本不好找合适的RPM包,所以最好还是自己编译安装。可以先跳到[第二节](# 2 编译FFmpeg),把FFmpeg编译完成之后再回来处理FreeSwitch的问题。

在编译完FFmpeg并更新动态库缓存之后就可以重新实施make了,如果make一切正常,就可以继续执行下面的步骤了:

1
2
3
make install 2>&1 | tee make.log
make cd-sounds-install
make cd-moh-install

如果一切顺利的话,就可以使用freeswitch了

2 编译FFmpeg

2.1 下载源码

1
2
3
4
5
6
7
cd ~
git clone https://github.com/FFmpeg/FFmpeg.git
cd FFmpeg
git checkout n3.4.9 
# 2.x版本中AVStream这个结构体里没有codecpar这个成员
# 而4.4.4中avresample这个依赖库被废弃了。
# 经过测试3.4.9一切正常

2.2 编译并安装

1
2
3
4
# 编译avresample这个库以及生成动态链接库
./configure --enable-avresample --enable-shared
make -j
make install 2>&1 | tee make.log

2.3 更新动态链接库

1
2
3
4
ldconfig
# 有些情况下,上面的那个命令可能不太好用,可能需要手动export一下环境变量。
编译生成的动态库文件在/usr/local/lib/这个路径下,可以通过下面这个命令来导入:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}

到此为止,我们就编译完了FFmpeg,如果你是从上一章跳过来的,现在就可以点击[这里](# 1.4 编译以及撞墙)跳回去了。