这篇文章是根据《ShiftMediaProject+VS2017+win764位环境搭建》 《使用 VS2015 编译并调试 ffmpeg》来编译的,亲自测试,并做个记录。

一环境
(1)、win7 64企业版
(2)、VS2015业版
(3)下载源代码工具 : git 客户端

二、下载源代码
1.项目地址:https://github.com/ShiftMediaProject/FFmpeg

需要注意的是,克隆到本地的目标项目目录 至少需要有2层,因为期望的项目的结构是这样子的:

  • msvc (OutputDir)                (该项目默认的 VS 编译输出的目录)
  • source                      (这个是需要的上一级目录,待会下载的依赖项目有很多,十几二十来个依赖项目都会下载到这里)
      - FFmpeg                    (这个是 clone 到本地的项目目录)
      - …Any other libraries source code… (其他的十几二十个依赖的项目)
    准备好文件夹后,比如这里上面的 “source” 文件夹,在这个文件夹下,克隆代码下来

git clone https://github.com/ShiftMediaProject/FFmpeg.git

2、切换到ffmpeg/SMP下,运行脚本project_get_dependencies.bat,该过程会下载编译ffmpeg所依赖的所有代码。过程比较耗时,可重复执行该命令,保证所有依赖代码全部下载。

下载项目中默认提供的其他依赖的 git 项目
ShiftMediaProject 使用默认的配置生成了一些项目文件,这些文件可以使用 VS 打开,同时需要依赖特定的额外的项目,才能进一步编译。

依赖的项目包括:

bzlib    iconv    zlib    lzma    libxml2    sdl2    libmp3lame    libvorbis    libspeex    libopus
libilbc    libtheora    libx264    libx265    libxvid    libvpx    libgme    libmodplug    libsoxr    libfreetype
fontconfig    libfribidi    libass    gnutls    libgcrypt    libssh    libcdio    libcdio_paranoia
libbluray    opengl    ffnvcodec    libmfx

上面大部分的依赖项目都被放在了 ShiftMediaProject 用户的 git 仓库,这些都可以手动下载,当然强烈建议还是使用 FFmpeg\SMP\project_get_dependencies.bat 批处理自动clone下载,这个脚本不仅仅可在第一次用于clone项目(及其本身依赖的其他git项目),还可以在后面任何时候执行,用来自动更新各自最新的版本

下载完后得到的文件如下:
在这里插入图片描述
在这里插入图片描述

3、从https://github.com/ShiftMediaProject/VSNASM下载VSNASM。
4、从https://github.com/ShiftMediaProject/VSYASM载VSYASM。

三、编译环境配置
1.安装VS汇编语言编译器nasm和vsyasm
方法1:
下载完后,注意最好 不要 直接运行 install_script.bat
在这里插入图片描述
最好是先 以管理员身份,在预设好 VS 相关变量的脚本环境中 (开发者命令行 / dev command line),运行该 install_script.bat 脚本
在这里插入图片描述
nasm:报错如下
在这里插入图片描述
没有找到解决的办法,转到方法2。

方法2:
分别执行 nasm和yasm只需运行各自文件夹下的install_script.bat安装脚本(注:要求管理员权限的命令行提示符运行)
nasm:直接运行
在这里插入图片描述

yasm:
在这里插入图片描述
一般YASM 不会有什么问题,如果NASM安装不上,可以手动下载安装包,nasm-2.14.02-win64.zip然后修改install_script.bat(没有试过)
转到方法3.

方法3:
(1)、将下载的VSYASM和VSNASM中的.props,.targets和.xml复制到“安装目录\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\BuildCustomizations”下。
(2)、将下载的VSYASM中的yasm-32.exe(根据自己编译的ffmpeg位数而定),复制到“安装目录\Microsoft Virusl Studio\2017\Enterprise\VC”下,并命名为yasm.exe。
(3)、从mingw中找到nasm.exe(根据自己编译的ffmpeg位数而定),复制到“安装目录\Microsoft Virusl Studio\2017\Enterprise\VC”下。

2.在/ffmpeg/SMP下有一个readme.txt,可根据其中的说明配置opengl, ffnvcodec和AMF。如下:
Many of the possible FFmpeg dependencies (and there dependencies) are available in the ShiftMediaProject repositories.
However the following is a list of extra dependency options that require external downloads:
1) opengl (requires glext)
a) Download glext.h and wglext.h from opengl.org.
b) Save the header files into “OutputDir/include/gl/".
c) Download khrplatform.h from khronos.org
d) Save the header file into "OutputDir/include/KHR/
”.
2) ffnvcodec (requires nv-codec-headers)
a) Download the nv-codec-headers repository from https://github.com/FFmpeg/nv-codec-headers
b) Save the contents of the nv-codec-headers repositories “include” folder into “OutputDir/include/".
3) AMF (requires Advanced Media Framework (AMF) SDK headers)
a) Download the AMF repository from https://github.com/GPUOpen-LibrariesAndSDKs/AMF
b) Save the contents of the AMF repositories “amf/public/include” into "OutputDir/include/AMF/
”.

1、下载 opengl 的 glext.h 和 wglext.h 到 " OutputDir/include/gl/* "   
2、下载 opengl 的 khrplatform.h 到 " OutputDir/include/KHR/* "
3、下载 nv-codec-headers 项目的 “include” 文件夹下的内容到 " OutputDir/include/* "
4、下载 AMF 项目的 “amf/public/include” 文件夹下的内容到 " OutputDir/include/AMF/* "

复制代码
OutputDir 是在项目属性里指定了的 “输出目录 ”
默认的项目输出目录是相对于 FFmpeg 源代码目录的 “…\msvc”

一个预期的目录结构如下,(这个也是前面 2、下载源代码 步骤中提到的文件结构)

  • msvc (OutputDir)                (该项目默认的 VS 编译输出的目录)
  • source                      (这个是需要的上一级目录,待会下载的依赖项目有很多,十几二十来个依赖项目都会下载到这里)
      - FFmpeg                    (这个是 clone 到本地的项目目录)
      - …Any other libraries source code… (其他的十几二十个依赖的项目)
    复制代码

所以,如上创建 msvc 目录,按步骤创建文件夹并下载对应文件(想偷懒的可以直接点击我下载后打包的 msvc.zip )
在这里插入图片描述
四、编译
用VS2015打开ffmpeg/SMP下的ffmepg_deps.sln.编译整个solution,ok。只要按照上述的方法,文件放置正确,可一次编译成功。编译出的文件在D:/ffmpeg/msvc

编译:LINK : fatal error LNK1104: 无法打开文件“libavfilterd.lib”
在这里插入图片描述
在这里插入图片描述
解决办法:(原文地址在文章结尾)
ShiftMediaProject项目中用到汇编语言编译器的项目有:

libxvidcore: yasm
libx265: nasm
libx264: nasm
libvpx: yasm
libswscale: vsyasm
libsaresample: vsyasm
libnettle: yasm
libhogweed: yasm
libgnutls: yasm
libgmp: yasm
libavutil: vsyasm
libavfilter: vsyasm

libavcodec: vsyasm

libass: yasm

为此,需将汇编语言编译器nasm(https://github.com/ShiftMediaProject/VSNASM)、yasm(https://github.com/ShiftMediaProject/VSYASM)、vsyasm(https://link.jianshu.com/?t=http://www.tortall.net/projects/yasm/releases/vsyasm-1.3.0-win32.zip)集成到visual studio2013中。 方法分别是:nasm和yasm只需运行各自文件夹下的install_script.bat安装脚本(注:要求管理员权限的命令行提示符运行),否则可能会安装失败。安装的结果为:拷贝(.pros、.targets、.xml)到C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations目录下,自动下载相应的可执行文件到C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC目录下(注意:这两处的路径跟VS安装的版本和路径有关)。vsyasm则需手动拷贝(.pros、.targets、.xml)三个文件到上述的BuildCustomizations目录下,并将vsyasm.pros文件中的将文中” ( P l a t f o r m ) “ 修 改 为 ” w i n (Platform) “ 修改为 ”win (Platform)win(PlatformArchitecture)“,保存。最后将vsyasm.exe拷贝到C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin目录下

编译成功!

在X86下编译
libx264以及使用这个依赖项的其他项目编译不过,x64全部都能编译通过。
在这里插入图片描述
经大神提醒:应该是不小心搞坏了。为此删掉libx264重新下载,编译通过

五、调试
调试报错如下:
在这里插入图片描述
根据如下解决:
最后的最后,编译完运行 “本地 Windows 调试器”,大概会弹出错误如下:
在这里插入图片描述
这是因为“调试”->“命令”使用的文件路径,和 实际在“链接器”->“常规”中设置的“输出文件”路径不一致导致,将前者设置和后者一致即可。

现在可以调试如下
在这里插入图片描述

参考文章:
1.《VS2013 update5 采用ShiftMediaProject编译FFmpeg
2.《vs2015编译ffmpeg源代码,ShiftMediaProject编译FFmpeg
3.《win10 vs2017 ShiftMediaProject/ffmpeg 工程编译 踩过的坑 总结篇

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐