ffmpeg编译笔记:ubuntu18.04交叉编译win-ffmpeg,引入libx264,libx265,libfdk-aac,libfreetype等第三方库

本文主要是介绍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/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等第三方库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/280673

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个