ffmpeg的依赖编译
视频分析视觉处理时经常要用到视频和流的编解码处理这就难免要用到ffmpeg这货了,官方的dll 有时调试和部署时因编译器不同库有时出错,而且也不能修改源码的操作和定制。部署有时依赖问题造成冲突程序崩溃。
ffmpeg的编译是 linux下发展过来的依赖链接比较麻烦。
下面就将ffmpeg的vc依赖和其他依赖都剔除 编译出单个ffmpeg动态库(dll)和静态库(lib) (w0aw) CSDN下载
我记个笔记: (效果如下)

ffmpeg官方下载源码down下来目前是4.1 以后的版本大同小异
因ffmpeg需要用MSYS2+msvc来编译的
官方下载MSYS2安装 用pacman命令安装 yasm nasm pkgconfig 工具因我的MSYS2早装了可能还pacman了其他库 到时看提示缺什么吧,注意不用pacman安装 g++因为这里是用msvc.将ffmpeg源码在MSYS2的home解压 见图

编译之前ffmpeg有许多的第三方库依赖 看个人需求先用vc编译依赖的库的静态版lib 我这里以sdl为例因为等会儿ffplay播放器是依赖sdl才编译出来的。这里我贴出路径下的pkgconfig pc文件和配置格式(仔细看下哦)其他库像x264 x265等等同理设置如下

将库放到pkg能检测到位置 有的库不是pkg搜索的放 vc可搜索的位置这里是MSYS2的usr\include和lib 现在从MSVC进msys
修改msys的启动脚本让VC的环境变量都继承到MSYS2环境中 改msys2_shell中的set MSYS2_PATH_TYPE=inherit 打开注释
现在从vs的命令行cd到msys下运行msys2_shell就行了。
中间缺什么用 whereis进行搜索测试下。
下面是全部依赖的第三方库,这些自己看需要去编译。我这里就花点功夫全部分编译静态版。都是/MT依赖于winapi的核心库(system32下)。全部文件如下图opt (注意libavcodec libav ...8个文件夹我只是将头文件拷这)


最后就是cd到ffmpeg源码目录进行config测试了 看提示缺什么就补什么,如果不用也可以关闭掉。直到全部ok生成makefile后就能执行,这个过程还是比较麻烦的中间会报很多提示主要是路径和pkg的pc文件检测
./configure --enable-gpl --enable-version3 --enable-bzlib --enable-iconv --enable-lzma --enable-sdl2 --enable-zlib --enable-avisynth --enable-libmp3lame --enable-libvorbis --enable-libspeex --enable-libopus --enable-libilbc --enable-libtheora --enable-libx264 --enable-libx265 --enable-libxvid --enable-libvpx --enable-libgme --enable-libmodplug --enable-libsoxr --enable-libfreetype --enable-fontconfig --enable-libfribidi --enable-libass --enable-libxml2 --enable-gnutls --disable-schannel --enable-gcrypt --enable-libssh --enable-libcdio --enable-libbluray --enable-opengl --enable-libmfx --enable-ffnvcodec --enable-cuda --enable-amf --toolchain=MSVC
直到全部通过 没有报错
make
make install

看到ffplay了吧。现在avcodecs avformat xx 8个库的默认是依赖到msvcrt.dll的, 生成的dll用depends看下依赖是不是都是system32核心依赖 而且确定第三方库也不依赖vcxx库 到此为止也该就是大家在常见的编译教程了。
接下来就对可编译的工程处理成想要的动态版大dll ffmpeg.dll和静态版lib
分别将avcoudcs xx xx xx xx库的中间编译中间文件.obj 或.o拷贝到一个新建文件夹libffmeg中,为了方便我全部改为obj文件。
这里有几个库有部分文件名冲突提示替换 分别是avcodec avformat 等5个库中约有100多个obj需要改下名称 我是通过bat copy出来在前面加上_的,一共全部obj有约2014个(具体看我共享盘的文件里的我将全部obj打包了 冲突文件名前加_ 或后面加2等。总之避开冲突)。将第三方库全部拷贝到新建x86文件夹中
最后就将其与第三方依赖库链接打包成一个ffmpeg_static.lib静态库就生成了。
具体就看下图操作 将2014个obj生成ffmpeg_objs.lib

下面将ffmpeg_objs.lib和第三方库的全部lib生成 ffmpeg_static静态大lib


超大静态lib就生成了。有了静态库就不难生成dll了。将ffmpeg目录里面所有的def文件里的函数合并为一个libffmpeg.def文件一共是1099个函数。为了方便 用vc创建个空静态库工程把ffmpeg_static.lib拖进vc去,再在属性附上def 编译 就生成了ffmpeg.dll
也可以用link.exe命令行 这个很长就不弄了还是交给VC。
下面就写个小播放器测试下

分别链接个静态版和动态版exe 效果就这样了。

有了原生 的动态/静态库像其他的库依赖ffmpeg就再也不必担心了。链接动态静态都可。
到此为止怎么链接开心就怎么弄,自己发挥吧。我贴出全部生成文件和中间obj文件网盘
链接:https://pan.baidu.com/s/1EM4i_TKNTjCTeDkamMUNXA
提取码:w0aw
libffmpeg_20190321223922.7z

本文详细记录了如何在Windows上使用MSYS2和MSVC编译ffmpeg4.1,去除所有依赖,生成独立的动态库ffmpeg.dll和静态库ffmpeg.lib。涉及编译环境设置、第三方库的静态编译、ffmpeg配置、解决文件名冲突等问题,最终实现无额外依赖的ffmpeg库。
1418

被折叠的 条评论
为什么被折叠?



