Skip to content
ho1iarty edited this page Apr 21, 2016 · 4 revisions

一、使用MSVC编译FFmpeg

以编译32位FFmpeg为例,其它版根据需要自行修改。

工具

Visual Studio 2013
MSYS2
YASM
gas-preprocessor.pl(可选)

准备工作

  1. 进入MSYS2目录,将/usr/bin/link.exe重命名为link_bak.exe,避免与VS自带的link.exe冲突。
  2. 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备份。
  3. 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

克隆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编译完成。

二、在Visual Studio 2013中编译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两部分。