本章分两部分,第一部分介绍ubuntu下ffmpeg库的编译,第二部分介绍ubuntu下Qt调用ffmpeg库。
ffmpeg库编译
编译环境建议切换到root下操作,新建文件夹/opt/ffmpeglib/,cd进来,在这里下载安装包、后续安装编译等操作
编译依赖的资源我已打包上传资源,包括编译好的库,嫌麻烦的同学可以直接下载使用:
https://download.csdn.net/download/weixin_40355471/23230845
资源包含:ffmpeg.tar.gz,编译好的ffmpeg库;ffmpeg-4.0.6.tar.bz2,ffmpeg源码;nasm-2.14.02.tar.bz2;SDL2-2.0.8.tar.gz;x264;x265_3.2.tar.gz;yasm-1.3.0.tar.gz;zlib-1.2.3.tar.gz;
下载ffmpeg源码
我下载的是4.06版本,ffmpeg-4.0.6.tar.bz2
http://www.ffmpeg.org/download.html
安装yasm
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xvzf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make
make install
centos7安装可尝试yum install yasm
安装nasm
wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.bz2
tar xvf nasm-2.14.02.tar.bz2
cd nasm-2.14.02
./configure
make
make install
安装其他依赖
apt install cmake -y
apt install pkg-config //后面编译x264和x265需要
编译x264
ubuntu:
x264下载地址:
http://ftp.videolan.org/pub/videolan/x264/snapshots/
tar xvf x264-snapshot-20191024-2245-stable.tar.bz2
cd x264-snapshot-20191024-2245-stable
./configure --enable-static --prefix=…/x264 --enable-pic
或
./configure --enable-static --enable-shared --prefix=…/x264 --enable-pic
make
make install
centos7用下面的方法
cd ~/x264
make uninstall
make distclean
./configure --enable-static --disable-opencl
make
make install
编译x265
如果x265编译失败,可以不用,后续编译ffmpeg不编译x265就可以
x265下载地址:
http://ftp.videolan.org/pub/videolan/x265/
tar xvf x265_3.2.tar.gz
//和x264编译不一样,264直接在根目录下编译,265要进入这个目录
cd x265_3.2/build/linux/
cmake -G “Unix Makefiles” -DCMAKE_INSTALL_PREFIX=“…/…/…/x265” -DENABLE_SHARED:bool=off …/…/source
make -j
make install
编译SDL2
编译之前先安装
sudo apt-get install libx11-dev
sudo apt-get install xorg-dev
下载SDL的源码,http://libsdl.org/release/
tar zxvf SDL2-2.0.8.tar.gz
cd SDL2-2.0.8
./configure
make
make install
centos7尝试下面方法
(1) wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
(2)选择列出的SDL并安装
1、yum install SDL2_gfx-devel.x86_64
2、yum install SDL2_image-devel.x86_64
3、yum install SDL2_ttf-devel.x86_64
4、yum install SDL2.x86_64
编译zlib
下载zlib-1.2.3.tar.gz
tar -zxvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure
vi Makefile
找到 CFLAGS=-O3 -DUSE_MMAP
在后面加入-fPIC,即变成CFLAGS=-O3 -DUSE_MMAP -fPIC
接下面步骤
make
make install
编译ffmpeg
解压缩源码包ffmpeg-4.0.6.tar.bz2,cd进来依次执行
#这种方式是生成动态库和头文件的
./configure --enable-shared --enable-nonfree --enable-gpl --enable-pthreads --enable-libx264 --enable-libx265 --prefix=…/ffmpeg
#配置安装的系统目录,可用ffmpeg命令行
./configure --enable-libx264 --enable-gpl --prefix=/usr/local/ffmpeg --extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib
make
sudo make install
第二种configure方式,配置一下环境变量
sudo vim /etc/profile
export PATH=$PATH:/usr/local/ffmpeg/bin# 在最后PATH添加环境变量
source /etc/profile
ffmpeg -version#查看ffmpeg版本
编译完成后,在目标文件夹生成bin、include、lib、share4个文件夹
问题1,libx264 not found
最后一步编译ffmpeg时报错libx264 not found
解决
把编译好的x264目标文件include和lib文件夹里面的文件,分别拷贝到/usr/local/include和/usr/local/lib文件里面
在./configure最后添加–extra-cflags=-I/usr/local/include --extra-ldflags=-L/usr/local/lib
问题2,relocation R_X86_64_32S against `ff_mqc_qe’ can not be used when making a shared object; recompile with -fPIC
编译ffmpeg时报错,解决,在前面加CFLAGS=“-O3 -fPIC”:
CFLAGS=“-O3 -fPIC” ./configure --enable-shared --enable-nonfree --enable-gpl --enable-pthreads --enable-libx264 --prefix=…/ffmpeg
Qt调用ffmpeg库
把编译生成的ffmpeg文件夹(包含bin、include、lib、share4个文件夹),拷贝到qt工程目录(/home/chw/HSCompany/videoCall/),根据目录结构在pro文件添加
INCLUDEPATH+=/home/chw/HSCompany/videoCall/ffmpeg/include
LIBS+=-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lavcodec\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lavdevice\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lavfilter\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lavformat\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lavutil\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lswresample\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lswscale\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lpostproc
测试打印配置信息和版本号
//打印ffmpeg配置
qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" "<<avcodec_configuration();
//打印ffmpeg版本号
qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" "<<avcodec_version();
打印输出:
[ ../ffmpegTestUbu/mainwindow.cpp ] 13 MainWindow --enable-shared --enable-nonfree --enable-gpl --enable-pthreads --enable-libx264 --prefix='…/ffmpeg'
[ ../ffmpegTestUbu/mainwindow.cpp ] 14 MainWindow 3805796
Qt调用ffmpeg库,移植到其他电脑
如果是移植到其他没有安装上述软件包的电脑,使用上面方式会提示缺少依赖库,修改pro文件:
INCLUDEPATH+=/home/chw/HSCompany/videoCall/ffmpeg/include
LIBS+=-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lx264\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lva\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lSDL2\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lva-drm\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lva-x11\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lvdpau\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lavcodec\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lavdevice\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lavfilter\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lavformat\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lavutil\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lswresample\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lswscale\
-L/home/chw/HSCompany/videoCall/ffmpeg/lib/ -lpostproc
把ffmpeg依赖的这些库也拷贝到/home/chw/HSCompany/videoCall/ffmpeg/lib/文件夹里面,文件目录如下,这些文件在编译ffmpeg过程中生成,在编译的系统里搜索即可。
这些库我已打包上传,需要的可直接下载:
https://download.csdn.net/download/weixin_40355471/25618549
问题,/lib/x86_64-linux-gnu/libz.so.1👎 error: error adding symbols: DSO missing from command line
编译时报错,也有可能会报libXext.so.6、libX11.so.6、xcb等的类似错误,解决:
pro文件添加
LIBS += -lz
LIBS += -lXext
LIBS += -lX11
LIBS += -lxcb