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安装
  1. 下载:
    https://sourceforge.net/projects/libpng/files/libpng16/1.6.39/
  2. 配置:
    ./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
  3. 编译:
    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/freetype2

make  && 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-shared

make  && 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 上,它有一些不同的功能集,有助于某些需要最大吞吐量的用例。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅笑一斤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值