centos 7下 带264编码的ffmpeg安装

x264各个版本下载  http://download.videolan.org/pub/videolan/x264/snapshots/

ffmpeg 各个版本下载 http://ffmpeg.org/releases/

基本可以按照时间进行ffmpeg与x264版本选择对应


1, 到http://www.videolan.org/developers/x264.html下载264编码库last_x264.tar.bz2

tar -xjf last_x264.tar.bz2 
cd x264-snapshot-20180520-2245/
./configure --prefix=/usr/local/x264 --enable-shared --enable-static --disable-asm
make
make install


2, 到http://ffmpeg.org/download.html下载 ffmpeg 最新版本ffmpeg-4.0.tar.bz2


tar xjf ffmpeg-4.0.tar.bz2
cd ffmpeg-4.0/
./configure --prefix=/usr/local/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/usr/local/x264/include --extra-ldflags=-L/usr/local/x264/lib


//-j7 7个核编译, 加快编译速度
make -j7
make install


3, 测试


ffmpeg -v


如果无异常则安装成功;
异常
错误信息:
ffmpeg: error while loading shared libraries: libavdevice.so.56: cannot open shared object file: No such file or directory
先 find / -name libavdevice.so.56 得到该文件的目录地址,我找到的是在ffmpeg安装目录的lib目录下;
/usr/local/ffmpeg/lib/


vim /etc/ld.so.conf.d/ffmpeg.conf
添加 /usr/local/ffmpeg/lib/ 到/etc/ld.so.conf.d/ffmpeg.conf里


错误信息:
找不到libx264.so.155
find / -name libx264.so.155


vim /etc/ld.so.conf.d/x264.conf

添加 /usr/local/x264/lib/


4, 查看是否有264编码器

ffmpeg -encoders |grep 264

centos 7下 带264编码的ffmpeg安装


5,注意: 如果在某参机子上编译的ffmpeg库, 放到另一台机子用时. 最好--disable-autodetect, 不然ffmpeg会自动检测原机子上的安装情况, 有可能原机子上装了很多软件. 导致此库移到目标机子上用时, 目标机因为少了很多库而非常麻烦. 比如报下面错:

centos 7下 带264编码的ffmpeg安装

 用了--disable-autodetect就不用编译不需要的项。不然要自己添加 --disable-libxcb --disable-libxcb-shm --disable-libxcb-xfixes --disable-libxcb-shape --disable-d3d11va --disable-libdrm --disable-dxva2 --disable-vaapi 

  

问题与解决:

1, 

[[email protected] monitor]# g++ -o Release/FaceMonitor -Wl,-gc-sections   -L/usr/local/lib -L/usr/local/lib/poco -L/usr/local/lib/FaceSDK/Release -L/lib64 -L/usr/local/lib/Poco -L/usr/local/ffmpeg-3.1/lib/ -L/usr/local/x264_for_ffmpeg_3.1/lib -Wl,--start-group Release/FaceRecognitionThread.o Release/FaceSAThread.o Release/H264DecoderThread.o Release/main.o Release/NotificationThreads.o Release/VideoFaceDetectionThread.o Release/VideoFaceRecApp.o Release/DBLoader.o Release/FaceMonitorMessage.o Release/FaceRecognition.o Release/GetIP.o Release/stringhelper.o Release/UTF8Converter.o Release/utility.o -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_legacy -lopencv_objdetect -lopencv_nonfree -lPocoFoundation -lPocoUtil -lPocoNet -lPocoJSON -lPocoData -lPocoDataSQLite -lPocoDataMySQL -lpthread -lrt -lCKLAgePredictor -lCKLFaceCrop -lCKLFaceRecognizer -lCKLFaceTracking -lCKLGenderPredictor -lCKLPointDetector -lSeetaFaceDetection -lSeetaFaceAlignment -lblas -llapack -larmadillo -lboost_thread -lboost_system -ltacopie -lcpp_redis -lavformat -lavcodec -lavutil -lswscale -lswresample -lavcodec -lavdevice -lx264 -ldl -lm -lz  -Wl,--rpath='$ORIGIN'  -fopenmp -Wl,--end-group
/usr/bin/ld: Release/H264DecoderThread.o: undefined reference to symbol '[email protected]@LIBAVCODEC_57'
/usr/bin/ld: note: '[email protected]@LIBAVCODEC_57' is defined in DSO /usr/local/ffmpeg-3.1/lib/libavcodec.so.57 so try adding it to the linker command line
/usr/local/ffmpeg-3.1/lib/libavcodec.so.57: could not read symbols: 无效的操作

collect2: 错误:ld 返回 1

已经加了-lavcodec, 却始终报找不到. 原因是在/usr/local/lib下还有个静态库libavcodec.a  将这个静态库删除后正常.

一般情况下都是多版本库冲突问题. 注意在/usr/local/lib下不要放ffmpeg库


查了很多资料,总结了以下几种可能的原因:

1、链接时缺少相关的目标文件(.o)
2、链接时缺少相关的库文件(.a/.so)
3、链接的库文件中又使用了另一个库文件
4、多个库文件链接顺序问题
5、在c++代码中链接c语言的库,没有添加extern "C";
6、ffmpeg过时;

7、头文件和你的库文件不匹配(你安装了多个版本的ffmpeg时);

8、路径、需要的库包含不全。

对于第七类问题,参考https://github.com/MaartenBaert/ssr/issues/215,执行locate -b libavcodec.so你会发现有许多的对应的动态文件输出,当你在.pro添加库文件路径时,并不能确定链接的是动态库还是静态库,我添加路径的时候是静态库(.a)的路径,但是实际上链接的确是动态库的文件(.so)。

2, 在release.mak里只连接静态库方法:将ffmpeg与x264的动态库保存到新建目录so_bak下. 让编译器只能找到静态库.

centos 7下 带264编码的ffmpeg安装