本文主要是介绍ffmpeg编译笔记:ubuntu18.04交叉编译win-ffmpeg,引入libx264,libx265,libfdk-aac,libfreetype等第三方库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言:
ubuntu18.04的交叉编译环境,请看我的另一篇博客:https://blog.csdn.net/linyibin_123/article/details/131214295。
如果不想编译可以直接下载我编译好的库:https://download.csdn.net/download/linyibin_123/87966470
一、编译第三方库
1.1 X264编译:
1)下载:
git clone https://code.videolan.org/videolan/x264.git
2)配置:
PREFIX_X264=/home/yibin/ffmpeg/build/libx264-build-x86
./configure --cross-prefix=i686-w64-mingw32- --host=i686-w64-mingw32 --enable-pic --enable-static --prefix=/home/yibin/ffmpeg/build/libx264-build-x86
首次配置libx264库 可能出现:Found no assembler 问题。
解决的办法是:将 --disable-asm 添加到命令行,或者安装nasm
3)编译:
make && make install
1.2 X265编译:
1.2.1 下载:
http://ftp.videolan.org/pub/videolan/x265/
1.2.2 cmake安装:
libx265编译需要用到cmake,按如下命令进行cmake环境安装:
sudo apt install cmake
sudo apt-get install cmake-curses-gui
1.2.3 交叉编译过程:
参考:https://blog.csdn.net/m0_37554445/article/details/123727198
1)解压:
tar zxvf x265_3.2.1.tar.gz
2)在x265_3.2/build 目录下新建文件夹:build_i686,然后在新建的文件里创建文件:build.cmake,编辑内容如下:
#!cmake
# this one is important
SET(CMAKE_SYSTEM_NAME Windows)SET(cross_prefix i686-w64-mingw32-)# specify the cross compiler
SET(CMAKE_C_COMPILER ${cross_prefix}gcc)
SET(CMAKE_CXX_COMPILER ${cross_prefix}g++)
SET(CMAKE_RC_COMPILER ${cross_prefix}windres)
SET(CMAKE_ASM_NASM_COMPILER nasm)SET(CMAKE_CXX_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")
SET(CMAKE_C_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")
SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")
SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")
3)命令输入:
PREFIX_X265=/home/yibin/ffmpeg/build/libx265-build-x86
cmake -DCMAKE_TOOLCHAIN_FILE=build.cmake -DCMAKE_INSTALL_PREFIX=${PREFIX_X265} -DENABLE_SHARED=0 -DENABLE_PIC=1 ../../source
make
make install
4)修改生成的x265.pc,新增-lstdc++ -lgcc -lgcc -static
Libs: -L${libdir} -lx265 -lstdc++ -lgcc -lgcc -static
Libs.private: -lstdc++ -lgcc -lgcc
1.3 libfdk-aac
libfaac是一个aac音频编码库,可将采集到的PCM数据编码为aac数据。与MP3相比,AAC是一种编码效果更高,编码音质更好的音频编码格式。FFMpeg可以组成AAC的三种编码器有:aac: FFmpeg本身的AAC编码实现、libaac: 第三方的AAC编码器、libfdk_aac: 第三方的AAC编码器。FDK-AAC库是FFMpeg支持的第三方编码库中质量最高的AAC编码库。
1)下载
git clone https://github.com/mstorsjo/fdk-aac.git
2)配置
./configure --host=i686-w64-mingw32 --prefix=/home/yibin/ffmpeg/build/libfdkaac-build-x86 --enable-static --disable-shared --with-mp4v2=no
3)编译
make && make install
1.4 libfreetype (ffmpeg滤镜功能需要)
开源字库,是一个开源、高质量、可扩展、可定制、可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括点阵字、TrueType、OpenType、Type1、CID、CFF、Windows FON/FNT、X11 PCF等。libfreetype用于ffmpeg滤镜功能。
freetype2依赖的开发包是zlib, bzip2, libpng, harfbuzz,所以要先安装这些库
1.4.1 zlib安装
1)下载:
http://www.zlib.net/
2)配置:
export CC=i686-w64-mingw32-gcc
./configure --prefix=/home/yibin/ffmpeg/build/zlib-build-x86 --static
3) 编译:
make -j8 && make install
export CC=“”
1.4.2 libpng安装
- 下载:
https://sourceforge.net/projects/libpng/files/libpng16/1.6.39/ - 配置:
./configure --host=i686-w64-mingw32 --prefix=/home/yibin/ffmpeg/build/libpng-build-x86 LIBS=-L/home/yibin/ffmpeg/build/zlib-build-x86/lib CPPFLAGS=-I/home/yibin/ffmpeg/build/zlib-build-x86/include --disable-shared - 编译:
make -j8 && make install
(make -j 选项表示并行编译。 make -j8,让make最多允许8个编译命令同时执行,这样可以更有效的利用CPU资源)
1.4.3 libfreetype安装
1)下载:http://download.savannah.gnu.org/releases/freetype/
2)配置:
export PKG_CONFIG_PATH=/home/yibin/ffmpeg/build/libpng-build-x86/lib/pkgconfig:/home/yibin/ffmpeg/build/zlib-build-x86/lib/pkgconfig
./configure --host=i686-w64-mingw32 CC=i686-w64-mingw32-gcc --prefix=/home/yibin/ffmpeg/build/freetype2-build-x86
3)编译:
make -j8 && make install
1.5 libfontconfig (ffmpeg滤镜功能需要)
libfontconfig是一款字体配置和自定义软件库。
依赖expat。
1.5.1 expat 安装:
1)下载:
http://distfiles.macports.org/expat/
2)配置编译:
./configure --without-tests --without-examples --prefix=/home/yibin/ffmpeg/build/expat-build-x86 --host=mingw32 CC=i686-w64-mingw32-gcc CXX=i686-w64-mingw32-g++make && make install
1.5.2 libfontconfig安装
1)下载
https://www.freedesktop.org/software/fontconfig/release/
2)配置编译:
export CC=i686-w64-mingw32-gcc./configure --host=i686-w64-mingw32 --prefix=/home/yibin/ffmpeg/build/libfontconfig-build-x86 FREETYPE_LIBS='-lfreetype -L/home/yibin/ffmpeg/build/freetype2-build-x86/lib' FREETYPE_CFLAGS=-I/home/yibin/ffmpeg/build/freetype2-build-x86/include/freetype2make && make install
1.6 libfribidi (ffmpeg滤镜功能需要)
1)下载
https://www.linuxfromscratch.org/blfs/view/svn/general/fribidi.html
2) 配置编译:
export CC=i686-w64-mingw32-gcc
./configure --host=i686-w64-mingw32 --prefix=/home/yibin/ffmpeg/build/libfribidi-build-x86 --enable-static --disable-sharedmake && make install
二、ffmpeg编译,引入第三方库
2.1 配置环境变量:
export PKG_CONFIG_PATH=/home/yibin/ffmpeg/build/libx264-build-x86/lib/pkgconfig:/home/yibin/ffmpeg/build/libx265-build-x86/lib/pkgconfig:/home/yibin/ffmpeg/build/libfdkaac-build-x86/lib/pkgconfig:/home/yibin/ffmpeg/build/zlib-build-x86/lib/pkgconfig:/home/yibin/ffmpeg/build/libpng-build-x86/lib/pkgconfig:/home/yibin/ffmpeg/build/freetype2-build-x86/lib/pkgconfig:/home/yibin/ffmpeg/build/libfribidi-build-x86/lib/pkgconfig:/home/yibin/ffmpeg/build/expat-build-x86/lib/pkgconfig:/home/yibin/ffmpeg/build/libfontconfig-build-x86/pkgconfig
2.2 配置命令:
注意:加入 libx264与libx265就不能启用编译ffplay,可能是SDL库与libx264、libx265库冲突导致
./configure --enable-static --enable-shared --enable-version3 --enable-gpl --enable-libx264 --extra-cflags="-I/home/yibin/ffmpeg/build/libx264-build-x86/include" --extra-ldflags="-L/home/yibin/ffmpeg/build/libx264-build-x86/lib -static" --enable-libx265 --extra-cflags="-I/home/yibin/ffmpeg/build/libx265-build-x86/include" --extra-ldflags="-L/home/yibin/ffmpeg/build/libx265-build-x86/lib" --enable-asm --enable-nonfree --enable-openssl --enable-protocols --enable-protocol=https --extra-cflags="-I/home/yibin/ffmpeg/build/openssl-build-x86/include/openssl" --extra-ldflags='-static-libgcc' --extra-ldflags="-L/home/yibin/ffmpeg/build/openssl-build-x86/lib" --disable-pthreads --enable-w32threads --enable-cross-compile --target-os=mingw32 --arch=x86 --enable-small --prefix=/home/yibin/ffmpeg/build/ffmpeg-build-x86 --extra-version=avbuild --disable-doc --enable-runtime-cpudetect --disable-ptx-compression --enable-mediafoundation --disable-vulkan --disable-postproc --disable-htmlpages --cross-prefix=i686-w64-mingw32- --disable-indevs --disable-outdevs --disable-debug --enable-hwaccels --enable-dxva2 --enable-libfreetype --extra-cflags="-I/home/yibin/ffmpeg/build/freetype2-build-x86/include" --extra-ldflags="-L/home/yibin/ffmpeg/build/freetype2-build-x86/lib" --enable-libfdk-aac --extra-cflags="-I/home/yibin/ffmpeg/build/libfdkaac-build-x86/include" --extra-ldflags="-L/home/yibin/ffmpeg/build/libfdkaac-build-x86/lib" --enable-libfontconfig --extra-cflags="-I/home/yibin/ffmpeg/build/libfontconfig-build-x86/include" --extra-ldflags="-L/home/yibin/ffmpeg/build/libfontconfig-build-x86/lib" --enable-libfribidi --extra-cflags="-I/home/yibin/ffmpeg/build/libfribidi-build-x86/include/fribidi" --extra-ldflags="-L/home/yibin/ffmpeg/build/libfribidi-build-x86/lib" --pkg-config-flags="--static"
以上配置说明:
1)–extra-ldflags=“-L/home/yibin/ffmpeg/build/libx264-build-x86/lib -static”
ffmpeg默认链接的是动态库,所以会出现该编译错误:
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_param_default,函数 _X264_init 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_param_parse,函数 _X264_init 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_param_cleanup,函数 _X264_close 中引用了该符号
libx264.o : error LNK2019: 无法解析的外部符号 __imp__x264_param_default_preset,函数 _X264_init 中引用了该符号在–extra-ldflags中加了“-static”可以解决。
2)–pkg-config-flags=“–static”
加入–pkg-config-flags=“–static” 可以解决ffmpeg对第三方库静态链接问题.
2.3 编译:
make && make install
生成:
三、 测试功能
查看 FFmpeg 已安装的编码器:
ffmpeg -encoders
3.1 ffmpeg使用libx264编码
ffmpeg -i input-h265.mp4 -c:v libx264 -x264-params threads=1:br:1000:maxrate=1000:minrate=1000:bufsize=1000 out.mp4
3.2 ffmpeg使用libx265编码
ffmpeg -i input-h264.mp4 -c:v libx265 -x265-params threads=1:br:1000:maxrate=1000:minrate=1000:bufsize=1000 out.mp4
3.3 ffmpeg使用libfdk-aac编码
ffmpeg -i iuput.wav -c:a libfdk_aac -b:a 128k output.m4a
FFmpeg使用libfdk_aac将input.wav转为恒定码率为128kbit/s 编码为AAC的output.m4a音频文件
相关使用看:https://zhuanlan.zhihu.com/p/605496943
3.4 ffmpeg 滤镜的使用
可以用:ffmpeg --help filter=drawtext 查看滤镜功能参数。
如果想要使用drawtext,编译时需要加上–enable-libfreetype。
如果要选择多种字体,需要加上–enable-libfontconfig。
如果还需要字体变形,需要加上–enable-libfribidi。
1)添加文字:
ffmpeg -i input-h264.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':x=20:y=20" output.mp4
2)添加图片:
ffmpeg -i input.mp4 -vf "movie=logo.png[wm]; [in][wm]overlay=30:10[out]" output.mp4
参考:
https://blog.csdn.net/migu123/article/details/129314333 https://blog.csdn.net/u014552102/article/details/104442111
三、其他第三方库说明
3.1 librtmp
librtmp是一个开源的基于C语言的库,提供了一个连接RTMP服务器,发送和接收RTMP流的API。它可以用来开发流媒体播放器,网络直播等应用。它的主要特点是快速、稳定和低延迟。
librtmp支持RTMP,RTMPS,RTMPE和RTMPTE加密协议等多种协议。除此之外,它还支持PProxy,PPlayer和appspot的代理服务器协议。在Linux下,使用librtmp开发的应用可以支持Windows,Android等多种系统平台。
librtmp的核心代码是基于ffmpeg中的libavformat库实现的。它依赖于libz, libssl, libcrypto等第三方库,需要自行编译安装。
下载:
git clone git://git.ffmpeg.org/rtmpdump
编译:
make CROSS_COMPILE=i686-w64-mingw32- INC=“-I/home/yibin/ffmpeg/build/openssl-build-x86/include -I/home/yibin/ffmpeg/build/zlib-build-x86/include” XLDFLAGS=“-L/home/yibin/ffmpeg/build/openssl-build-x86/lib -L/home/yibin/ffmpeg/build/zlib-build-x86/lib” SYS=mingw32 prefix=/home/yibin/ffmpeg/build/rtmp-build-x86 install
3.2 libmp3lame
mp3编码库
CFLAGS=-DFORCEINLINE= ./configure --host=i686-w64-mingw32 --prefix=/home/×××/Desktop/ffmpeg282/opensdk --enable-static --disable-shared --disable-frontend
make
make install
3.3 libspeex
“Speex编解码器的libspeex包囊括了所有的语音编码和解码函数。libspeexdsp静态库,库里面包含了预处理器、声学回音消除器、重采样器、自适应抖动缓冲器等相关的函数。 testdenoise:测试噪音抑制。 testecho:测试声学回音消除。
3.4 libxvid
Xvid MPEG-4 Part 2 的封装
3.5 libtheora
libtheora选项 对品质和码率产生影响
3.6 libvorbis
“libvorbis是Xiph 组织自行研发的音频压缩解压编码器,一般将 Vorbis 数据封装到 ogg 文件里面,这个库是用来解码和编码 Vorbis 音频数据的,但是,还需要 libogg 来将经过编码的音频数据从 ogg 文件里面释放出来才行,也就是说,需要配合 libogg 和 libvorbis 一起使用,才能解码出 ogg 文件里面的音频数据
3.7 libopenjpeg
./configure --host=i686-w64-mingw32 --prefix=/home/haibindev/opensdk --enable-static --disable-shared
“OpenJPEG是一种基于C语言的开源编解码器,用于压缩和解压缩JPEG2000图像。与其他图像格式不同,JPEG2000具有高压缩率、高质量、多分辨率和无损压缩等特点,被广泛应用于医学图像处理、卫星遥感图像处理、高清视频传输等领域。 OpenJPEG不仅提供了基本的编解码功能,还支持数据流式处理、各种压缩选项以及与其他格式的转换等多种高级功能。
3.8 libogg
Ogg全称是OGGVobis(oggVorbis)是一种音频压缩格式,类似于MP3等的音乐格式。Ogg是完全免费、开放和没有专利限制的。OggVorbis文件的扩展名是".ogg"。Ogg文件格式可以不断地进行大小和音质的改良,而不影响旧有的编码器或播放器。
./configure --host=i686-w64-mingw32 --prefix=/home/×××/Desktop/ffmpeg282/opensdk --enable-static --disable-shared
make
make install
3.9 libmfx qsv硬解功能
参考下:
https://blog.csdn.net/haiyangyunbao813/article/details/107829583
https://github.com/lu-zero/mfx_dispatch
autoreconf -i
./configure --host=i686-w64-mingw32
make -j$(nproc)
make install DESTDIR=/usr/x86_64-w64-mingw32
./configure --cross-prefix=i686-w64-mingw32- --host=i686-w64-mingw32 --prefix=/home/yibin/ffmpeg/build/libmfx-build-x86 --enable-static --disable-shared
https://github.com/Intel-Media-SDK/MediaSDK/releases
qsv依赖mfx库, libmfx 是 Intel 的专有库,用于在 Linux 和 Windows 上使用 Quick Sync 硬件。在 Windows 上,它是比使用 DXVA2/D3D11VA 访问之外的更高级功能的主要方式,尤其是编码。在 Linux 上,它有一些不同的功能集,有助于某些需要最大吞吐量的用例。
这篇关于ffmpeg编译笔记:ubuntu18.04交叉编译win-ffmpeg,引入libx264,libx265,libfdk-aac,libfreetype等第三方库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!