在centos7.9环境下,搭建webrtc服务时,用到了aiortc,aiortc又依赖pylibsrtp,pylibsrtp可以简单理解为python对系统libsrtp的封装包,但是由于7.9内置的libsrtp版本过低,导致在引用aiortc时报错:Segmentation fault,系统无法运行,遂自行编译并安装较新版本的 libsrtp,然后让 pylibsrtp 关联到这个正确版本的库,从而避免加载到系统中过旧或不兼容的 libsrtp。
1. 安装基础依赖
如果你的系统尚未安装开发工具和 CMake、OpenSSL 头文件等,先安装这些依赖:
sudo yum install -y epel-release
sudo yum install -y gcc gcc-c++ make cmake openssl-devel
2. 编译并安装 libsrtp
aiortc (确切说是 pylibsrtp) 会依赖 libsrtp >= 1.5 版本,但 CentOS 7 仓库自带的 libsrtp 往往是 1.4 或更老,极易导致不兼容甚至崩溃。可以选择较新稳定版本(例如 2.4.x 或 2.5.x)进行编译安装。下面以 2.4.2 为例:
# 获取源码
git clone https://github.com/cisco/libsrtp.git
cd libsrtp
# 切换到想要的版本
git checkout v2.4.2
# 配置并启用 OpenSSL
./configure --prefix=/usr/local --enable-openssl --with-openssl-dir=/usr/local/openssl CFLAGS="-std=c99 -mssse3 -fPIC -O3"
make shared_library
sudo make install
# --with-openssl-dir:指定你本地安装的openssl目录,aiortc 的 DTLS 部分会依赖较新版本的 OpenSSL,建议尽量更新到 1.1.x 或更高版本,我另外一篇文章有安装教程
# CFLAGS="-std=c99 -mssse3 -fPIC -O3":由于 libsrtp 源码中默认使用了 SSSE3 指令优化和 C99 语法,需要显示添加编译选项(CFLAGS),启用 C99 及 SSSE3,否则会报错"SSSE3 instruction set not enabled"
# make shared_library而不是make:跳过编译测试程序,只需要 libsrtp 的核心动态库,否则会报一堆关于 struct ip_mreq、sigaction 等类型“incomplete type”的错误
3. 重新安装 pylibsrtp
如果你之前已经安装过 pylibsrtp,需要先卸载它,再通过源码或指定编译方式安装,让它找对我们刚刚安装的 libsrtp:
# 在 Python 虚拟环境或全局卸载老版本
pip uninstall -y pylibsrtp
# 重新安装,确保用的是本地编译,而不是预编译的 wheel
pip install --no-binary :all: pylibsrtp
这样 pylibsrtp 会主动寻找并链接到我们安装在 /usr/local/lib 下的新版 libsrtp,从而避免调用到过旧版本。
4. 再次安装 / 测试 aiortc
如果需要,也可以重新安装 aiortc,然后测试一下是否能正常导入:
pip install aiortc
# 测试
python -c "import aiortc; print('aiortc imported successfully')"
正常情况下会输出successfully,至此就完成了libsrtp升级。👍
5. 如果测试时出现引用错误‼️
ImportError: libsrtp2.so.1: cannot open shared object file: No such file or directory
说明 Python 在导入 pylibsrtp 时,运行时动态链接器找不到新安装的 libsrtp2.so.1。也就是说,libsrtp 虽然已经安装到你的系统某个目录了,但是动态链接库路径并没有被正确加载。编译安装的库默认放在 /usr/local/lib 或 /usr/local/lib64 下(也可能在其他前缀路径)。若该目录不在系统默认的库搜索路径里,就会出现 “No such file or directory”。
1)先找到libsrtp2.so.1 的实际安装位置
sudo find / -name "libsrtp2.so.1" 2>/dev/null
2)把所在目录加入到 /etc/ld.so.conf.d 配置
假设搜索结果为 /usr/lib/libsrtp2.so.1,创建一个新的配置文件(如 libsrtp.conf)
echo "/usr/lib" | sudo tee /etc/ld.so.conf.d/libsrtp.conf
3)刷新链接缓存
sudo ldconfig
4)确认生效
ldconfig -p | grep libsrtp
如果能找到 “libsrtp2.so.1” 指向 /usr/lib/libsrtp2.so.1,说明已经加入系统库路径。
5)再次测试
python -c "import aiortc; print('aiortc imported successfully')"
如果一切正常,不再出现 “cannot open shared object file”。
libSRTP
Secure Real-time Transport Protocol (SRTP),项目地址