文章目录
ffmpeg在不同平台交叉编译windows版sdk(64bit)
- 关于ffmpeg在windows下的编译,官方有这篇说明http://www.ffmpeg.org/platform.html#toc-Windows
- 建议先阅读一下,美中不足的是官方说的太简陋,只是提供了一个编译的方向,至于编译细节就需要自己摸索了
- 本文也正是在摸索过程中的总结,我们的最终目标都是要windows版的64位sdk,但我们可以在windows平台编译,也可以在linux平台交叉编译,本文就是记录这两种方式的编译过程,希望能帮到一些在编译过程中茫茫无措的你
注意
-
在编译过程中请仔细查看控制台打印的日志,特别是警告,configure在检测环境时会根据编译环境修改你的配置,比如你打开了硬件加速开关,但configure检测到本地环境不适合,比如找不到相应的头文件,那么会自动帮你关闭硬件加速,这时会在控制台打印一行日志提醒你,比如
WARNING: Disabled hevc_dxva2_hwaccel because not all dependencies are satisfied: dxva2 DXVA_PicParams_HEVC WARNING: Disabled h264_dxva2_hwaccel because not all dependencies are satisfied: dxva2
在windows平台编译windows版sdk
搭建编译环境
安装mingw-w64
- windows下载并安装mingw-w64(http://mingw-w64.org/doku.php/download/mingw-builds)
- 安装时架构选x86_64,线程选win32,其他默认即可
- 安装完成后在环境变量可以看到多了MINGW_HOME(没有就新建),我们需要将“%MINGW_HOME%/bin”配置进Path环境变量
安装msys2
-
windows下载msys2并安装(https://www.msys2.org/)
-
安装完msys2后先不要着急打开,因为msys2默认下载东西是非常慢的,因此需要增加国内镜像路径,具体做法如下
-
在安装目录的etc\pacman.d目录下找到如下三个文件,打开后增加如下行,记得要放在首行
# mirrorlist.mingw64 Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64 Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64
# mirrorlist.mingw32 Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686 Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686
# mirrorlist.msys Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch
-
在mysys2安装目录找到mingw64.exe打开
-
执行如下命令安装一些编译环境及工具
# s刷新软件包数据 pacman -Sy # normal msys2 packages pacman -S vim make pkg-config diffutils # mingw-w64 packages and toolchains pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2
-
其中mingw-w64-x86_64-SDL2目前是不需要的,因为我们编译的目标是库,也不打算使用ffplay,因此这个可以不安装
-
安装执行完毕后我们可以看到mysy2安装目录下的mingw64增加了一些文件,在mingw64/bin目录里就存放了我们编译过程中需要的东西,而我们编译后如果依赖了一些动态库,基本上都可以在这里找到(比如libiconv-2.dll,不过放心,这种依赖可以避免的,在后面会讲到)
下载ffmpeg源码
- 将ffmpeg下载下来(我当时的最新版是4.2),以下命令会下载最新版到ffmpeg目录,其他下载方式也行,只要能把源码下载到即可
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
- 下载后到ffmpeg目录执行以下命令,这样就会生成一些mak文件,否则会报找不到这些文件的错误
./configure 或 ./configure --disable-x86asm
编译
-
环境搭建好了之后,就可以开始编写编译脚本了
-
我们先在ffmpeg目录创建build目录作为我们的编译目录,编译脚本和编译目标之后都会放在这个目录下
-
在build目录下新建build_wins_sdk.sh并增加可执行权限,内容如下:
#!/bin/bash echo "Beginning Make ..." rm -r dist_wins_dll mkdir -p dist_wins_dll cd ../ make clean echo "configure ..." ./configure --prefix=$(pwd)/build/dist_wins_dll \ --enable-gpl --enable-version3 \ --enable-shared \ --disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe \ --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \ --disable-asm --disable-sdl2 --disable-iconv --disable-schannel --disable-zlib \ --disable-avdevice --disable-postproc --disable-avfilter \ --disable-everything --enable-protocol=file --enable-demuxer=mov --enable-demuxer=flv --enable-decoder=h264 --enable-decoder=hevc --enable-hwaccel=hevc_dxva2 --enable-hwaccel=h264_dxva2 echo "make ..." make -j4 echo "make install ..." make install echo "Make Finishing"
-
以上配置仅供参考(每个人都需要根据自己的需求去更改),更多配置需要参考configure文件里的说明,我这里只是开启了h264和hevc解码器以及他们的硬件加速而已
-
之后就可以打开mingw64.exe并切换到脚本目录后执行这个脚本
-
当执行到./configure命令后,在控制台我们是可以看到类似如下输出,这里记录了编译时的各项参数设置,想知道你的configure配置是否合乎你的要求,可以在这里检查一下,比如External libraries这个就列出了依赖的外部库,如果说编译出的dll会依赖libiconv.dll这些额外的动态库导致报错,那么在这里就会显示iconv,要去除这个依赖,需要我们在configure上增加–disable-iconv
install prefix /f/software/ffmpeg/ffmpeg-4.2.2/build/dist_wins_dll source path . C compiler gcc C library mingw64 ARCH c (generic) big-endian no runtime cpu detection yes debug symbols yes strip symbols yes optimize for size no optimizations yes static no shared yes postprocessing support no network support no threading support w32threads safe bitstream reader yes texi2html enabled no perl enabled no pod2man enabled no makeinfo enabled no makeinfo supports HTML no External libraries: External libraries providing hardware acceleration: d3d11va dxva2 Libraries: avcodec avutil swscale Programs: Enabled decoders: h264 hevc Enabled encoders: Enabled hwaccels: h264_dxva2 hevc_dxva2 Enabled parsers: Enabled demuxers: Enabled muxers: Enabled protocols: Enabled filters: Enabled bsfs: null Enabled indevs: Enabled outdevs: License: GPL version 3 or later
-
如果正常编译成功,那么我们就可以在dist_wins_dll目录中看到生成四个文件夹,如下图,在bin目录里就是我们需要的dll
在linux平台交叉编译windows版sdk
搭建mingw-w64环境
-
在linux平台交叉编译windows的话我们需要在linux平台搭建mingw64环境
-
网上已有大神写了一个脚本帮我们搭建此环境,地址在https://github.com/Zeranoe/mingw-w64-build
-
这个脚本下载下来后运行
./mingw-w64-build x86_64
-
脚本就会帮我们下载mingw64,不过可能要科学上网才行,不然下载速度堪忧
-
在脚本运行过程中可能会提示一些工具需要安装,你就安装它的要求把工具装好
-
脚本正常执行后,我们可以看到多了x86_64-w64-mingw32目录,我们接着需要设置下环境变量
export PATH="$PATH:/your_install_dir/mingw-w64-build/x86_64-w64-mingw32/bin"
- 注意以上配置路径要修改为你自己的路径,不要照抄哈
- 这种是临时性的环境变量,机器重启后要使用的话还得重新执行一下
编译
-
在linux交叉编译windows需要开启交叉编译选项–enable-cross-compile,同时必须设置–arch和–target_os,还有–cross-prefix(交叉编译工具链的前缀,注意最后要有横线)
-
由于我们需要64位的,因此可以配置
- –arch=x86_64
- –target_os=mingw32-w64
- –cross-prefix=x86_64-w64-mingw32-
-
这样在编译时configure会根据–cross-prefix的值加上–cc设置的值(默认是gcc),凑成x86_64-w64-mingw32-gcc去交叉编译,这也解释了我们为何要配置环境变量,x86_64-w64-mingw32-gcc这个东西就放置在我们搭建的mingw-w64的bin目录下,如果我们不配置环境变量,系统自然找不到x86_64-w64-mingw32-gcc这个家伙
-
以下列出了一个参考脚本,这个脚本只开启了h264和hevc以及硬解(这里之所以能开启硬解是因为mingw里包含了dxva2api.h)等,实际上你肯定要根据自己的需求更改configure的参数
#!/bin/bash echo "Beginning Make ..." rm -r dist_wins_dll mkdir -p dist_wins_dll cd ffmpeg make clean echo "configure ..." ./configure --prefix=$(pwd)/../dist_wins_dll \ --enable-cross-compile --arch=x86_64 --target-os=mingw32-w64 --cross-prefix=x86_64-w64-mingw32- \ --enable-gpl --enable-version3 --enable-runtime-cpudetect \ --enable-shared \ --disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe \ --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \ --disable-asm --disable-sdl2 --disable-iconv --disable-schannel --disable-zlib \ --disable-avdevice --disable-postproc --disable-avfilter \ --disable-everything --enable-protocol=file --enable-demuxer=mov --enable-demuxer=flv --enable-decoder=h264 --enable-decoder=hevc --enable-hwaccel=hevc_dxva2 --enable-hwaccel=h264_dxva2 echo "make ..." make -j4 echo "make install ..." make install echo "Make Finishing"
-
以上脚本执行后正常的话你就可以看到生成了dist_wins_dll目录,里面就是我们需要的动态库以及头文件,可以愉快地拿去二次开发了
问题
我编译出的dll一使用就会报libiconv-2.dll或zlib1.dll或其他dll找不到的错误,这个怎么解决?
- 这个一般都是依赖了外部库导致的,在执行到./configure命令时控制台会打印配置信息,我们可以观察控制台看看"External libraries:"这一行打印了什么,假如打印了iconv,那么就表示依赖iconv这个库,那么我们只要在在configure时加上–disable-iconv即可,zlib也如此
- 或者我们在mingw64的bin目录下找到依赖的这两个库的dll,拷贝过来后也是可以运行的
参考
(4条消息)编译库的方法(基于MSYS2与MinGW-w64)(零)——安装MSYS2与MinGW-w64_运维_图像学习之旅-CSDN博客
https://blog.csdn.net/qq_35789421/article/details/99740382
基于Ubuntu交叉编译X264, FFmpeg Windows SDK详细教程 - haibindev - 博客园
https://www.cnblogs.com/haibindev/archive/2011/12/01/2270126.html
(4条消息)Ubuntu+Mingw64编译WIN32版本的FFMPEG_运维_u010311952的专栏-CSDN博客
https://blog.csdn.net/u010311952/article/details/80658999
Msys2 | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
https://mirror.tuna.tsinghua.edu.cn/help/msys2/
(1条消息)MSYS2镜像源_网络_ELF Project-CSDN博客
https://blog.csdn.net/pkgfs/article/details/50410271