问题描述

FreeSWITCH版本:1.10.5
CentOS:CentOS Linux release 7.9.2009 (Core), 64位

使用下面的命令,在会议室里面播放png图片:

  1. conference 3000 play {png_ms=100}/usr/local/freeswitch/flv/bg.png

提示报错:

[ERR] switch_core_video.c:3044 This function is not available, libpng not installed

问题定位

打开对应的源代码,可以看到只有定义了宏PNG_SIMPLIFIED_READ_SUPPORTED,才能正确使用switch_img_read_png方法。
而这个宏根据注释,是定义在libpng1.6.0中的,所以需要安装这个版本。
image.png

问题解决

安装libpng1.6.37

libpng-1.6.37.tar.gz
下载地址:链接

解压之后,标准流程:
./configure && make && make install

在安装完成后,可以看到在/usr/local/lib/pkgconfig下面含有libpng16.pc和libpng.pc文件。
freeswitch主要依靠pc文件来检查库和依赖库。

尝试1:重新编译freeswitch代码

./configure && make && make install

编译mod_av报错

CC libavmod_la-avformat.lo
In file included from /usr/include/ffmpeg/libavutil/imgutils.h:31:0,
from avformat.c:39:/usr/include/ffmpeg/libavutil/pixdesc.h:34:5: error: type of bit-field ‘plane’ is a GCC extension [-Werror=pedantic]
uint16_t plane : 2; ^/usr/include/ffmpeg/libavutil/pixdesc.h:40:5: error: type of bit-field ‘step_minus1’ is a GCC extension [-Werror=pedantic]
uint16_t step_minus1 : 3; ^/usr/include/ffmpeg/libavutil/pixdesc.h:46:5: error: type of bit-field ‘offset_plus1’ is a GCC extension [-Werror=pedantic]
uint16_t offset_plus1 : 3; ^/usr/include/ffmpeg/libavutil/pixdesc.h:52:5: error: type of bit-field ‘shift’ is a GCC extension [-Werror=pedantic]
uint16_t shift : 3; ^/usr/include/ffmpeg/libavutil/pixdesc.h:57:5: error: type of bit-field ‘depth_minus1’ is a GCC extension [-Werror=pedantic]
uint16_t depth_minus1 : 4;

修改freeswitch-1.10.5.-release/src/mod/applications/mod_av/Makefile,
去掉编译选项里面的pedantic

SWITCH_ANSI_CFLAGS = -Wall -std=c99 -Wdeclaration-after-statement

重新测试

编译完成后,测试发现播放png仍然报错。

尝试2:使用configure参数--with-pkgconfigdir指定libpng16

使用下面的命令编译:
./configure --with-pkgconfigdir=/usr/local/lib/pkgconfig |grep libpng
得到下面的结果:

checking for libpng >= 1.6.16… checking for libpng16 >= 1.6.16… checking for libpng >= 1.2.49… no

尽管已经指定了pkgconfig的路径,还是查找不到libpng

尝试3:使用PKG_CONFIG_PATH变量指定libpng库的路径

  1. export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
  2. ./configure |grep libpng

输出结果如下:

[root@idc-146 freeswitch-1.10.5.-release]# ./configure |grep libpng
checking for libpng >= 1.6.16… yes
checking LIBPNG_CFLAGS… -I/usr/local/include/libpng16

成功找到libpng16

再之后就可以自己测试了。

总结

在使用源代码安装完libpng16之后,需要使用下面的命令来完成编译:

  1. export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
  2. ./configure |grep libpng