第三方组件:
libfdk-aac, librtmp, libsrt, libx264, libx265, libmbedtls
我用的机器是centos7, 先声明,此配置没有图形显示相关的东西,也没有ffplay,建议需要的看一下文章尾部,然后根据ffmpeg的帮助文档自行配置。下面根据项目需要,先编译相关的第三方组件。
安装curl:
sudo yum install curl
说明:我的安装路径设置成了/home/young/workDir/thirdparty/media_built,可根据需要安装在不同路径。如果不设置prefix选项,则安装在系统默认路径/usr/local。
zlib:如果需要交叉编译,应该在./configure 前面执行 export CHOST=xxx,xxx表示你的交叉编译器
./configure --prefix=/home/young/workDir/thirdparty/ffmpeg_built --shared
openssl:如果需要交叉编译,需要添加编译选项:--cross-compile-prefix=xxx, xxx表示你的编译器前缀,如:arm-hisiv500-linux-
./config --prefix=/home/young/workDir/thirdparty/ffmpeg_built no-asm shared zlib-dynamic \
--with-zlib-include="/home/young/workDir/thirdparty/ffmpeg_built/include" \
--with-zlib-lib="/home/young/workDir/thirdparty/ffmpeg_built/lib"
注意:在编译时遇到 ./libcrypto.so: undefined reference to `getcontext' 这种错误,应该加上 no-async 重新配置,删去Makefile中的-m32 和-m64,原因是该编译器没有提供GNU C 的ucontext库
mbedtls:如果需要交叉编译,在cmake前面加上 CC=xxx,xxx表示你的编译器,如:arm-hisiv600-linux-gcc
1、必须要切换到某个开发分支才可以进行下面的编译,这里切换到2.6分支:
git checkout -b mbedtls-2.6 origin/mbedtls-2.6
2、清除配置信息:
find . -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} +
3、执行 cmake:
cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On . \
-DCMAKE_INSTALL_PREFIX=/home/young/workDir/thirdparty/ffmpeg_built
4、编译:设置VERBOSE=1是为了使编译的时候打印出更多编译信息,如果不设置,则是静默编译。
make VERBOSE=1 && make install
编译x264,x265和ffmpeg时需要用到汇编器,先安装nasm和ysam
nasm:交叉编译增加选项 --host=xxx 进行设置你的编译器
./configure --prefix=/home/young/workDir/thirdparty/media_built && make && make install
yasm:交叉编译增加选项 --host=xxx 进行设置你的编译器
sed -i 's#) ytasm.*#)#' Makefile.in && \
./configure --prefix=/home/young/workDir/thirdparty/media_built && make && make install
注意:sed -i 's#) ytasm.*#)#' Makefile.in: 这条命令是阻止编译仅在windows上使用的两个程序(vsyasm 和 ytasm)
x264:交叉编译增加选项 --host=xxx 进行设置你的编译器,或者增加 --cross-prefix=xxx,设置编译器前缀
export PATH=$PATH:/home/young/workDir/thirdparty/media_built/bin && \
./configure --prefix=/home/young/workDir/thirdparty/media_built \
--enable-shared \
--disable-cli && make && make install
注意:export 命令是指定刚才我们安装的汇编器的路径,在编译x264的时候需要用到它。
--disable-cli:禁止构建多余的命令行编码器,因为大多数的输入格式都需要FFmpeg
cmake 3.20.3: 需要依赖libuv和libarchive,所以我们先编译安装这两个工具,都安装在系统默认路径就行。
libuv1.41.0:
sh autogen.sh && ./configure --disable-static && make -j4 && make install
libarchive:
./configure --disable-static && make -j4 && make install
编译安装cmake:
./bootstrap --system-libs --mandir=/share/man --no-system-jsoncpp \
--no-system-librhash --system-curl --system-zlib \
--docdir=/share/doc/cmake-3.20.3 && make -j4 && make install
x265:如果需要交叉编译,在cmake前面加上 CC=xxx,xxx表示你的编译器,如:arm-hisiv600-linux-gcc
mkdir built && cd built && \
cmake -DCMAKE_INSTALL_PREFIX=/home/young/workDir/thirdparty/media_built ../source && \
make -j4 && make install
fdk-aac:交叉编译增加选项 --host=xxx 进行设置你的编译器
./configure --prefix=/home/young/workDir/thirdparty/media_built \
--disable-static && make -j4 && make install
librtmp:交叉编译需要在 make 后面加上 -DCROSS_COMPILE=xxx,xxx表示你的编译器,也可直接在Makefile中开头的位置增加CROSS_COMPILE=xxx
1.cd librtmp && vi Makefile
2.修改安装目录:prefix=/home/young/workDir/thirdparty/ffmpeg_built
3.make && make install
srt:交叉编译需要增加选项 --with-compiler-prefix=xxx, xxx表示你的编译器前缀
1、需要先切换到某个release版本,否则在使用过程中可能会出现一些问题,切记!这里切换到v1.4.4分支:
git checkout v1.4.4
配置和编译:
./configure --prefix=/home/young/workDir/thirdparty/media_built --disable-static \
--openssl-include-dir=/home/young/workDir/thirdparty/media_built/include \
--openssl-ssl-library=/home/young/workDir/thirdparty/media_built/lib && \
make -j4 && make install
以上都准备好的我们需要的第三方库和编译环境,下面开始配置和编译ffmpeg
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/young/workDir/thirdparty/media_built/lib/pkgconfig && \
./configure --prefix=/home/young/workDir/thirdparty/media_built \
--enable-gpl \
--enable-version3 \
--enable-nonfree \
--disable-static \
--enable-shared \
--enable-libfdk-aac \
--enable-librtmp \
--enable-libsrt \
--enable-libx264 \
--enable-libx265 \
--enable-mbedtls \
--disable-autodetect \
--disable-v4l2-m2m \
--disable-vaapi \
--disable-vdpau \
--disable-videotoolbox \
--disable-nvenc \
--disable-nvdec \
--disable-cuda-llvm \
--disable-cuvid \
--disable-d3d11va \
--disable-dxva2 \
--disable-vaapi \
--disable-ffnvcodec \
--disable-libdrm \
--disable-sdl2 \
--disable-libxcb \
--docdir=/home/young/workDir/thirdparty/ffmpeg-doc \
--extra-ldflags="-L/home/young/workDir/thirdparty/media_built/lib/" \
--extra-cflags="-I/home/young/workDir/thirdparty/media_built/include" && \
make -j4 && make install
注意:
1、export命令是设置PKG_CONFIG_PATH环境变量,因为ffmpeg寻找配置的第三方库的时候是使用pkg-config进行寻找的,所以我们需要在环境变量中指定我们编译安装的路径,否则在ffmpeg配置的时候会出错说找不到某个库。
2、我编译的这个ffmpeg因为是在服务器上使用,所以可以看到并没有图形显示,ui相关的配置,也没有配置ffplay,如有需要的请自行根据ffmpeg的帮助文档进行配置。
最后:
1、相关库已经上传到github,有需要的自行下载,地址:JHYoung1034/ffmpeg-package (github.com)
2、对于新手来说,可能编译编码库是一个痛苦的过程,因为有很多依赖,有很多路径,变量需要去设置。我们只要执行这些开源库的 confiugre --help 脚本查看帮助,认真看看相关选项,根据我们的需要进行设置,如果看了帮助还是搞不定,首先还是建议到这个源码库的github页去认真阅读帮助文档就可以。一般来说开源库都是有能让你用起来的文档说明,否则不明不白的开源库还不如不用。