1 、安装相关依赖
apt-get -y install build-essential autoconf automake cmake libtool git \
checkinstall nasm yasm libass-dev libfreetype6-dev libsdl2-dev libtool \
libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev \
libxcb-xfixes0-dev pkg-config texinfo wget zlib1g-dev libchromaprint-dev \
frei0r-plugins-dev ladspa-sdk libcaca-dev libcdio-paranoia-dev \
libcodec2-dev libfontconfig1-dev libfreetype6-dev libfribidi-dev libgme-dev \
libgsm1-dev libjack-dev libmodplug-dev libmp3lame-dev libopencore-amrnb-dev \
libopencore-amrwb-dev libopenjp2-7-dev libopenmpt-dev libopus-dev \
libpulse-dev librsvg2-dev librubberband-dev librtmp-dev libshine-dev \
libsmbclient-dev libsnappy-dev libsoxr-dev libspeex-dev libssh-dev \
libtesseract-dev libtheora-dev libtwolame-dev libv4l-dev libvo-amrwbenc-dev \
libvpx-dev libwavpack-dev libwebp-dev libx264-dev libx265-dev \
libxvidcore-dev libxml2-dev libzmq3-dev libzvbi-dev liblilv-dev libmysofa-dev \
libopenal-dev opencl-dev gnutls-dev libfdk-aac-dev
2、ffmpeg 5.1.3源代码下载(ffmpeg.org)
略
3、ffmpeg的配置选项
/configure --disable-shared --enable-static --enable-pthreads --enable-gpl --enable-nonfree --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-filters --enable-openssl --enable-runtime-cpudetect --extra-version=Patrickz
4、build&install
make
make install
5、基于ffmpeg静态库的二次开发
在基于ffmpeg的静态库开发时,需要注意的是,由于很多第三方的库并没有编译进ffmpeg的avformat、avcodec..这些静态库文件中,所以在开发时,除了引用对应的ffmpeg库文件,还要引库文件依赖的第三方库,否则会报各种reference error..;而如何知道该引用那些对应的库文件呢,经过google,发现答案就在ffmpeg生成的$lib/pkgconfig目录下,例如avcodec.pc就描述了其自身必要引用的第三方库,我们可以将其拷贝出来,更好的办法是使用pkg-config参数,防止二次依赖的缺失,例如
g++ -o decode_video decode_video.cc -lavcodec `pkg-config --libs --cflags libavcodec`
该参数会查找avcodec自身的依赖以及 其依赖的avutil的第三方依赖,其命令就是本质就是相关依赖的展开:
g++ -o decode_video decode_video.cc -I/usr/local/include -L/usr/local/lib -l:libavfilter.a -lavdevice -lavformat -lavcodec -lswresample -lavutil -lswscale -lvpx -lm -pthread -latomic -llzma -lfdk-aac -lmp3lame -lopus -lvorbis -lvorbisenc -lx264 -lz -lva-drm -lva-x11 -lva -lvdpau -lX11
这里的引用策略还是优先动态库,其次静态库,像x264或者aac的库,我们希望程序拷贝到其他机器上有可以运行,那么需要指定其静态引用:-l:libx264.a
g++ -o decode_video decode_video.cc -I/usr/local/include -L/usr/local/lib -l:libavfilter.a -lavdevice -lavformat -lavcodec -lswresample -lavutil -lswscale -lvpx -lm -pthread -latomic -llzma -l:libfdk-aac.a -lmp3lame -lopus -lvorbis -lvorbisenc -l:libx264.a -lz -lva-drm -lva-x11 -lva -lvdpau -lX11
这样编译出来的程序虽然大了些,但即使目标机器没有安装x264库也可以运行。
补:
二次开发的执行文件(将libavformat.a、libavcodec.a、libavutil.a静态编译进执行文件)在其他机器上执行找不到libvdpau.so库的问题。
按照静态编译的方式,编译通过,但在其他干净的linux系统上执行的时候,提示找不到libvdpau.so;
通过本机执行ldd和和编译错误,判断是libavutil.a文件因为没有禁用vdpau选项而依赖该so文件,但这个so并不是系统默认自带的常规库。
通过apt install vdpau-dev的时候也只安装了so的库。
一个方案是在configure中禁用该选项,这样后续就不需要依赖该模块。
在此情况下,考虑功能和部署的需求,考虑将其以静态编译的方式编译到文件中;
git clone git://anongit.freedesktop.org/vdpau/libvdpau
git checkout libvdpau-1.2 //要切换到1.2版本,才有autogen.sh
./autogen.sh --enable-static
make $MAKE_THREADS_CNT
make install
通过后,在编译执行文件的时候 加上 -l:libvdpau.a,将其编译进执行文件