-
Notifications
You must be signed in to change notification settings - Fork 7
Home
以编译32位FFmpeg为例,其它版根据需要自行修改。
Visual Studio 2013
MSYS2
YASM
gas-preprocessor.pl(可选)
- 进入MSYS2目录,将
/usr/bin/link.exe重命名为link_bak.exe,避免与VS自带的link.exe冲突。 - 从http://yasm.tortall.net/Download.html下载yasm。注意,下载general use版本,不要VC++版。将新下载的(例如yasm-1.3.0-win64.exe)改为名yasm.exe替换到
/usr/bin/yasm.exe,如果已存在yasm.exe,将其重命名为yasm_bak.exe备份。 - 从https://github.com/FFmpeg/gas-preprocessor下载gas-preprocessor.pl,并放入
/usr/bin目录
从开始菜单打开Microsoft Visual Studio 2013 -> VS2013 x86 本机工具命令提示,用cd命令进入到msys2目录,执行
mingw32_shell.bat
在启动的mintty中执行如下几个命令,查看相应的变量。
$ which cl
/c/Program Files (x86)/Microsoft Visual Studio 12.0/VC/BIN/x86_ARM/cl
$ which link
/c/Program Files (x86)/Microsoft Visual Studio 12.0/VC/BIN/x86_ARM/link
$ which armasm
/c/Program Files (x86)/Microsoft Visual Studio 12.0/VC/BIN/x86_ARM/armasm
$ which yasm
/usr/bin/yasm
$ which cpp
/usr/bin/cpp
$ which gas-preprocessor.pl
/usr/bin/gas-preprocessor.pl
确认无误后,可以开始编译
克隆FFmpeg源码
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg_git
进入ffmpeg目录
./configure \
--toolchain=msvc \
--arch=x86 \
--target-os=win32 \
--enable-cross-compile \
--disable-static \
--enable-shared \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--extra-cflags="-I<include_path> -MT" \
--extra-cxxflags="-I<include_path> -MT" \
--extra-ldflags="-LIBPATH:<lib_path> /nodefaultlib:msvcrt.lib" \
--prefix=<install_path>
make -j2
make install
上述参数仅为示例,可根据自己的需求修改。其中<include_path>,<lib_path>,<install_path>在编译其它库时可以根据需要添加,比如libx264。其中--extra-ldflags不能像linux平台一下指定-L<lib_path>,因为msvc中的库目录指定方式为/LIBPATH:<lib_path>,所以此处需要按msvc的写法修改一下。
至此,FFmpeg编译完成。
注:此步骤依赖上一步中生成的config.h等文件,务必先进行上述编译操作
在VS2013中新建**“空项目”**,命名为"ffmpeg_vs"。
-
将上一步中生成的bin\*.lib文件放入ffmpeg_vs\lib目录,并在“项目->属性->链接器->附加库目录”中添加lib目录
-
将include下的所有文件放入ffmpeg_vs\include目录,并在“项目->属性->C\C++->附加包含目录”中添加include目录
-
将bin\*.dll文件放入ffmpeg_vs目录
-
将ffmpeg_git源码目录下的下述文件拷贝到ffmpeg_vs目录,并添加入工程
cmdutils.c cmdutils.h cmdutils_common_opts.h config.h ffmpeg.c ffmpeg.h ffmpeg_filter.c ffmpeg_opt.c
此时可以F7尝试生成一下,当然,会报很多错,修改几个地方即可解决。
以下仅做参考,使用的FFmpeg源码版本为(git-2016-04-13-0efafc5)
-
注释所有#include "libavresample/avresample.h"的引用,暂时不需要它。
-
将所有未初始化的指针,在初始化时指定为NULL。
-
在config.h文件中修改
添加 #define inline __inline 添加 #define snprintf _snprintf 修改 #define HAVE_DXVA2_LIB 0(或是把dxva2相关的文件添加进来) 修改 #define CONFIG_NETWORK 0 -
cmdutils.c文件中print_all_libs_info函数里的内容注释掉。
-
在ffmpeg.c文件中修改
//添加如下内容 #pragma comment(lib, "avcodec.lib") #pragma comment(lib, "avdevice.lib") #pragma comment(lib, "avfilter.lib") #pragma comment(lib, "avformat.lib") #pragma comment(lib, "avutil.lib") #pragma comment(lib, "swresample.lib") #pragma comment(lib, "swscale.lib") //修改 write 改为 _write read 改为 _read kbhit 改为 _kbhit getch 改为 _getch int ret = avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height); 修改为 int ret = av_image_fill_arrays(pict.data, pict.linesize, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height, 1);
至此,执行“生成(F7)”即可编译成功。
CompilationGuide中的CompilationGuide/WinRT和CompilationGuide/MSVC两部分。