Ubuntu 18.04 下编译 Pjsua2

Published: 2020-03-20

Tags: pjsip pjsua2

本文总阅读量

根据官方给的文档,要使用 pjsua2 模块需要先安装好 pjsip 环境。pjsua2 模块是构建于 pjsip 之上的高层次封装 API,借助 SWIG,其它高级语言也可以引用使用 pjsua2 模块。

参照的这个官网教程:https://trac.pjsip.org/repos/wiki/Getting-Started/Autoconf

换源

备份 /etc/apt/sources.list 文件,将其内容替换为阿里源。

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

更新系统

sudo apt update

安装依赖包

此处的命令参考了 Docker Hub 上的构建命令:https://hub.docker.com/r/respoke/pjsip/dockerfile

PS:在编译软件时,如果官网的教程不是很详尽,参考 Docker Hub 上的镜像构建命令往往会有帮助。

sudo apt install -y --no-install-recommends \
            build-essential \
            ca-certificates \
            curl \
            libgsm1-dev \
            libspeex-dev \
            libspeexdsp-dev \
            libsrtp0-dev \
            libssl-dev \
            portaudio19-dev

根据文档上的要求,如果需要 Video 支持,需要安装 SDL,libyuv,OpenH264

安装 SDL2

sudo apt install libsdl2-dev

安装 yuv

有点忘记需不要手动安装,以及怎么安装的了

不过手动编译的方法如下

https://chromium.googlesource.com/libyuv/libyuv 可下载 Tar 包

编译

make -f linux.mk

复制库到指定目录

sudo cp libyuv.a /usr/local/lib/

安装 OpenH264

没找到源提供直接安装,所以手动编译,下载 Github 上的项目 https://github.com/cisco/openh264

下载后执行 make 构建完成 sudo make install 即可。

它会这几个库(libopenh264.a,libopenh264.so,libopenh264.so.2.1.0,libopenh264.so.5)复制到 /usr/local/lib/ 目录下。

make 时可能会提示系统没有 nasm,安装一下:

sudo apt install -y nasm

上传 Pjsip 项目代码 pjproject-2.10.zip

# 解压缩
unzip pjproject-2.10.zip

# 进入目录
cd pjproject-2.10

自定义配置

再源码目录编辑这个文件: pjlib/include/pj/config_site.h,添加 VIDEO 支持。

#define PJMEDIA_HAS_VIDEO   1

生成编译配置

--enable-shared 选项是为了后续 pjsua2 库能够被其它高级语言使用。

./configure --enable-shared

配置文件没有错误的话会提示自定义配置文件位置。

编译 pjsip

# 开始编译
make dep
make

# 编译没有错误则进行安装
sudo make install
# 刷新动态链接库
sudo /sbin/ldconfig

从输出得知,这些动态链接库被复制到了 /usr/local/lib/ 目录。

libpjsua2-x86_64-unknown-linux-gnu.a libpjsua-x86_64-unknown-linux-gnu.a libpjsip-ua-x86_64-unknown-linux-gnu.a libpjsip-simple-x86_64-unknown-linux-gnu.a libpjsip-x86_64-unknown-linux-gnu.a libpjmedia-codec-x86_64-unknown-linux-gnu.a libpjmedia-videodev-x86_64-unknown-linux-gnu.a libpjmedia-x86_64-unknown-linux-gnu.a libpjmedia-audiodev-x86_64-unknown-linux-gnu.a libpjnath-x86_64-unknown-linux-gnu.a libpjlib-util-x86_64-unknown-linux-gnu.a  libsrtp-x86_64-unknown-linux-gnu.a libsrtp.so.2 libsrtp.so libgsmcodec-x86_64-unknown-linux-gnu.a libgsmcodec.so.2 libgsmcodec.so libspeex-x86_64-unknown-linux-gnu.a libspeex.so.2 libspeex.so libilbccodec-x86_64-unknown-linux-gnu.a libilbccodec.so.2 libilbccodec.so libg7221codec-x86_64-unknown-linux-gnu.a libg7221codec.so.2 libg7221codec.so libwebrtc-x86_64-unknown-linux-gnu.a libwebrtc.so.2 libwebrtc.so libpj-x86_64-unknown-linux-gnu.a libpjsua2.so.2 libpjsua2.so libpjsua.so.2 libpjsua.so libpjsip-ua.so.2 libpjsip-ua.so libpjsip-simple.so.2 libpjsip-simple.so libpjsip.so.2 libpjsip.so libpjmedia-codec.so.2 libpjmedia-codec.so libpjmedia-videodev.so.2 libpjmedia-videodev.so libpjmedia.so.2 libpjmedia.so libpjmedia-audiodev.so.2 libpjmedia-audiodev.so libpjnath.so.2 libpjnath.so libpjlib-util.so.2 libpjlib-util.so libpj.so.2 libpj.so

Pjsip 的动态库有了,接下来编译 pjsua2

编译 pjsua2

官方文档:https://www.pjsip.org/docs/book-latest/html/intro_pjsua2.html

1,安装 SWIG

sudo apt install swig

2,安装 jre,jdk

sudo apt install default-jre
sudo apt install default-jdk

3,安装 python3 开发依赖

sudo apt install python3-dev

4,切换到 SWIG 模块目录

cd pjsip-apps/src/swig/

5,编译

make

6,安装

sudo make install

输出

make  -C python install
make[1]: Entering directory '/home/dongdong/proj/pjproject-2.10/pjsip-apps/src/swig/python'
python3 setup.py install --user
running install
running build
running build_py
running build_ext
running install_lib
copying build/lib.linux-x86_64-3.6/_pjsua2.cpython-36m-x86_64-linux-gnu.so -> /home/dongdong/.local/lib/python3.6/site-packages
copying build/lib.linux-x86_64-3.6/pjsua2.py -> /home/dongdong/.local/lib/python3.6/site-packages
byte-compiling /home/dongdong/.local/lib/python3.6/site-packages/pjsua2.py to pjsua2.cpython-36.pyc
running install_egg_info
Writing /home/dongdong/.local/lib/python3.6/site-packages/pjsua2-2.10.egg-info
make[1]: Leaving directory '/home/dongdong/proj/pjproject-2.10/pjsip-apps/src/swig/python'
make  -C java install
make[1]: Entering directory '/home/dongdong/proj/pjproject-2.10/pjsip-apps/src/swig/java'
make[1]: Nothing to be done for 'install'.
make[1]: Leaving directory '/home/dongdong/proj/pjproject-2.10/pjsip-apps/src/swig/java'

看输出已经将模块复制到了 site-packages,但是在 python3 的还是不没能导入 pjsua2 模块。

swig/python 子目录下执行模块的安装脚本

sudo python3 setup.py install

输出

running install
running build
running build_py
running build_ext
running install_lib
copying build/lib.linux-x86_64-3.6/_pjsua2.cpython-36m-x86_64-linux-gnu.so -> /usr/local/lib/python3.6/dist-packages
copying build/lib.linux-x86_64-3.6/pjsua2.py -> /usr/local/lib/python3.6/dist-packages
byte-compiling /usr/local/lib/python3.6/dist-packages/pjsua2.py to pjsua2.cpython-36.pyc
running install_egg_info
Writing /usr/local/lib/python3.6/dist-packages/pjsua2-2.10.egg-info

之后导入 pjsua2 模块测试,没再报错了

对照输出来看,没成功那次复制到了用户 .local 目录下,不在 Python3 的默认搜索路径内。

最近两天编译 Pjsip / Pjsua2 感触:

1,Windows 下编译很麻烦,网上教程少,浪费了一小天的时间,最后看着飙红的C盘放弃尝试。

2,Debian 系有时候软件包和教程要比 Fedora 多那么一些。

其它补充

1,测试编译一个GB28181-摄像头 测试 DEMO时,系统提示找不到 uuid 动态库,安装 uuid-dev 时提示已经安装,链接一下就可以了。

sudo ln -s /lib/x86_64-linux-gnu/libuuid.so.1 /usr/local/lib/libuuid.so

2,另外 demo 编译后报错,是因为示例中自带的 header 头文件是老版本的,而刚刚编译的库是 2.10 最新版的,不匹配造成的错误,只要把 2.10 源码目录的头文件收集起来放在 DEMO 目录,重新生成 Makefile,再编译就不会有运行时报错了

3,.pro 文件生成 Makefile 命令 qmake -o Makefile test.pro

# 安装 qmake
sudo apt install qtchooser

# Ubuntu 安装 QT5
sudo apt install qt5-default

# 如果需要 QT5 界面
sudo apt install qtcreator