本文共 5269 字,大约阅读时间需要 17 分钟。
Windows下编译可调试的ffmpeg, 包含ffplay
作者:史正邮箱:shizheng163@126.com如有错误还请及时指正如果有错误的描述给您带来不便还请见谅如需交流请发送邮件,欢迎联系
操作系统: Windows10 64
编译工具: MinGW+MSYS+yasm + SDL2.0MinGW
是Windows下模拟linux运行的库、头文件等的集合。msys
是Windows下模拟linux运行的最新系统, 可以通过类似于linux bash的命令行窗口进行代码编译。yasm
是ffmpeg编译时用到的汇编工具。SDL2.0
, ffmpeg编译ffplay时需要的SDL2源代码, 编译时要生成ffpaly, 执行configure脚本时比较加入--enable-sdl2
FFMPEG版本:ffmpeg-4.1
, 可从FFMPEG官方网址进行下载最新代码.
作者这里使用的编译器是QTCreator5.7.1 + MinGW, 同时有GitBash也可以模拟linux环境运行,但是执行完configure脚本后发现make
命令找不到, 所以干脆按照其他教程使用MinGW+MSYS+yasm
进行编译。
本文的编译环境安装目录为:D:\FFMPEGDir\MinGW
MinGW+Msys+Yasm的下载与安装可以参考以下博客:
下载完成后配置信息请切回本文继续, 本文所述与以上博客有轻微不同。
下载安装完成后MinGW目录结构如下(图中的SDL目录是后来放进去的):将下载完成后的yasm-1.3.0-win64.exe改名为yasm.exe
放置到D:\FFMPEGDir\MinGW\bin
下面。
D:\FFMPEGDir\MinGW\msys\1.0
执行msys.bat
输入df -h
$ df -hFilesystem Size Used Avail Use% Mounted onC:\Users\shizh\AppData\Local\Temp 119G 82G 37G 69% /tmpD:\FFMPEGDir\MinGW\msys\1.0 184G 33G 152G 18% /usrD:\FFMPEGDir\MinGW\msys\1.0 184G 33G 152G 18% /D:\FFMPEGDir\MinGW 184G 33G 152G 18% /mingwc: 119G 82G 37G 69% /cd: 184G 33G 152G 18% /de: 151G 74G 77G 49% /ef: 301G 213G 88G 71% /fg: 150G 14G 137G 9% /gh: 148G 4.7G 144G 4% /h
可以看到将D:\FFMPEGDir\MinGW
是挂载到了/mingw
下面.
gcc -v
验证gcc环境是否准备好。 $ gcc -vUsing built-in specs.COLLECT_GCC=D:\FFMPEGDir\MinGW\bin\gcc.exeCOLLECT_LTO_WRAPPER=d:/ffmpegdir/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exeTarget: mingw32Configured with: ../src/gcc-6.3.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --with-gmp=/mingw --with-mpfr --with-mpc=/mingw --with-isl=/mingw --prefix=/mingw --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-6.3.0-1' --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --enable-libgomp --disable-libvtv --enable-nlsThread model: win32gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)
如果提示gcc环境找不到, 手动设置下环境变量:export PATH="/mingw/bin:$PATH"
作者这里是自己根据源码编译的, 使用dev版本的SDL2.0执行ffmpeg的configure总是提示sdl2支持找不到
.
解压后进入相关文件夹
./configure --prefix=/d/FFMPEGDir/MingGW/SDL2/make -j4 && make install
注意, 这里的d/FFMPEGDir/MingGW/SDL2/
一定要先创建好
make -j
使用最高的线程数进行编译(8个线程), 导致CPU占用率过高, 电脑蓝屏!!! 本文ffmpeg源码路径位于:D:/FFMPEGDir/ffmpeg-4.1/ffmpeg-4.1
关闭杀毒软件, 作者在编译执行configure脚本时
时没有关闭360安全卫士, 一直提示出几个编译出的文件是木马软件。网上有一些教程时不关杀毒软件会导致执行脚本失败, 这里倒是没有注意。
进入D:\FFMPEGDir\MinGW\msys\1.0
, 执行msys.bat。
cd D:/FFMPEGDir/ffmpeg-4.1/ffmpeg-4.1export PATH="/mingw/SDL2/bin/:$PATH" ./configure --enable-shared --disable-static --enable-debug --enable-sdl2 --extra-cflags='-I/mingw/SDL2/include/SDL2/' --extra-ldflags='-L/mingw/SDL2/lib/' --prefix=D:/FFMPEGDir/ffmpegExport
ubuntu下执行配置脚本命令:
./configure --enable-shared --disable-static --enable-sdl2 --enable-debug=3 --disable-optimizations --disable-asm --disable-stripping --prefix=/home/shizheng/Workspace/ffmpegSrc/export
--enable-debug
是启动调试, 若不加此命令编译出的ffmpeg是无法进行调试的, 就不会生成ffmpeg_g的这些文件--enable-sdl2
启动SDL环境, 只有启用了sdl环境, 且配置脚本检测无误才会编译出ffplay
--disable-optimizations
禁用编译器优化--disable-asm
不适用汇编语言:ffmpeg有部分代码是使用汇编语言写的, 加此选项后不进行汇编代码的编译。--disable-stripping
禁用剥离可执行程序和共享库:这个不明白是什么意思, 但是加上此选项后make install安装的库文件会保留调试信息, 否则, make install安装后的lib中的库是没法进行调试的。--extra-cflags
, 额外的指定C编译器寻找的Inlcude路径, 这里是指定SDL2的头文件路径--extra-ldflags
, 额外指定链接器寻找链接库的路径,这里是指定SDL2的链接库路径--prefix=D:/FFMPEGDir/ffmpegExport
, 指定编译出的ffmpeg可执行程序以及相关头文件, 动态库的存放位置执行脚本, 等待脚本退出, 也可在ffmpeg源码的ffbuild路径下执行跟踪追踪进度tail -100f ffbuild/config.log
若执行完后, 提示sdl2支持找不到, 那就是SDL库的路径不对, 或者是因为SDL2的dev版本无法使用。
正确执行完后, 在输出的内容中寻找program
, 看看有没有ffplay, 正常的情况应该是ffmpeg ffprobe ffplay
.
如果执行完后提示WARNING: pkg-config not found, library detection may fail.
这个无需理会,这里不会对编译产生影响。
开始编译ffmpeg.
make -j4 && make install
若编译过程中出现如下错误, 打开libavformat/os_support.h
, 添加#include <winerror.h>
CC libavformat/paf.oIn file included from libavformat/os_support.h:112:0, from libavformat/os_support.c:29:libavformat/os_support.c: In function 'ff_gai_strerror':libavformat/os_support.c:194:10: error: 'ERROR_NOT_ENOUGH_MEMORY' undeclared (first use in this function) case EAI_MEMORY: ^libavformat/os_suppCCort.clibavformat/pcm.o:1:10: note: each undeclared identifier is reported only once for each function it appears inmake: *** [libavformat/os_support.o] Error 1make: *** Waiting for unfinished jobs....
这里作者不确定会不会出现这个问题, 因为第一天晚上编译时就没有报错, 第二天就出现了这个问题。
编译完成后需要将MinGWSDL2/bin/SDL2.dll
放置D:/FFMPEGDir/ffmpegExport/bin/
下, 否则运行ffplay会报
同时, 在cmd中使用ffmpeg与ffplay, ffprobe会报libiconv-2.dll
找不到, 这时可以从以下网址进行下载, 放入D:/FFMPEGDir/ffmpegExport/bin/
下。
编译后的ffplay执行时会提示如下警告
Warning: not compiled with thread support, using thread emulation
这是因为gcc版本导致的, 作者将gcc版本降级为5.3, 重新编译ffmpeg就没有出现这个警告了。
注意:
作者这里编出的ffpaly播放任何视频都会卡顿在第一帧, 音频会连续播放, 同时移动播放窗口以及在画面内连续点击会进行视频帧的切换, 这里怀疑是SDL的版本不适配导致的问题。转载地址:http://irhji.baihongyu.com/