FFmpeg在windows下编译
工具介绍
- Cygwin(Cygnus Windows) 在windows下运行的类Unix环境
- MinGW(Minimalist GNU for Windows) windows上的GNU工具集,与MSYS结合编译ffmpeg
- VS(Visual Studio 2015/2017…) 和MSYS配合编译ffmpeg
- MSYS2(Minimal SYStem 2) 一个小型的GNU环境,包含bash,make等等
Cygwin
直接安装使用,Cygwin进行了linuxAPI到widowsAPI的转换,使用Cygwin编译的.exe文件需要挂载一个cygwin.dll库才能在windows下运行,好处是不必修改原来代码里的对linux系统API的调用,缺点是是由于调用系统API经过转义执行效率有损失。
MinGW + MSYS2
官方推荐的方式,不必依赖三方dll,直接编译出windows原生程序,编译方式也与在linux下保持一致
VS + MSYS2
使用VS内置工具链编译
MinGW + MSYS2 方式编译
-
下载并安装MSYS2
https://www.msys2.org/ -
在MSYS2中安装依赖包
-
pacman -S make gcc diffutils pkg-config nasm
pacman是一个包管理工具,通过该指令安装需要的软件 -
安装sdl2,如果没有sdl2,无法编译出ffplay
pacman -Ss sdl2 以sdl2为关键字搜索相关的包,其中会有形式如下的包信息mingw64/mingw-w64-x86_64-SDL2 2.0.14-2 A library for portable low-level access to a video framebuffer, audio output, mouse, and keyboard (Version 2) (mingw-w64)
使用安装指令安装即可
-
下载ffmpeg
http://ffmpeg.org/download.html -
编译ffmpeg
运行 --prefix参数指定了install的路径./configure --prefix=D:/work_space/work_dir/av/ffmpeg/ffmpeg-4.4/output_win64 make -j 8 make install
这样会产生几个exe但并不会生成lib和dll
带上 --enable-shared 即可生成lib和dll -
拷贝依赖dll
直接运行install目录中下的 {install_dir}/bin/ffplay.exe会提示缺少依赖库,从sys2的安装目录msys64/mingw64/bin拷贝运行依赖库到ffplay.exe同级目录即可
VS + MSYS2编译
-
安装VS
-
设置VS环境变量
在windows的cmd任意目录中执行环境变量, 执行环境变量设置脚本
注需要在以管理员权限运行的终端中执行,执行后不要退出终端
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat -
关于MSVC几个编译器名称的解释
x86:编译器为x86版本,输出文件为x86。
amd64_x86:编译器为amd64版本,输出文件为x86。
amd64:编译器为amd64版本,输出文件为amd64。
x86_amd64:编译器为x86版本,输出文件为amd64。 -
修改msys2_shell文件
rem set MSYS2_PATH_TYPE=inherit
修改为
set MSYS2_PATH_TYPE=inherit -
执行msys2_shell.cmd,进入msys2的shell中
msys2_shell.cmd -mingw64 -use-full-path
这里需要提前将msys2_shell.cmd的路径加入环境变量,之前设置的VS的环境变量会在mys2中被自动继承 -
运行configure
./configure --toolchain=msvc --prefix=D:/work_dir/ffmpeg-5.0/release --enable-cross-compile --enable-shared // 如果是编译调试库 ./configure --toolchain=msvc --prefix=D:/work_dir/ffmpeg-5.0/debug --enable-debug --disable-optimizations --disable-asm --disable-stripping --enable-cross-compile --enable-shared 注意一定要加--disable-stripping, 如果不加此选项,ffmpeg在编译时,会使用strip去掉符号信息。 // 硬件加速则加上,ffmpeg支持多种硬件接口这里使用dxva2 --enable-dxva2 (Direct-X Video Acceleration API,) make -j8 make install