使用vs2013或vs2015 编译ffmpeg

本篇原始出处也在 我的有道云笔记 中。

参考的资料主要是下面两篇 

1、http://www.vcmfc.com/portal.php?mod=view&aid=27

2、(要翻墙)http://siliconandlithium.blogspot.jp/2014/01/building-ffmpeg-in-visual-studio.html

      我的系统是Win10 LTSB企业版,一开始在VS2013上编译,遇到点问题,求教第一篇文章的作者,他建议我用VS2015。后来发现其实用VS2013是没有问题的,因此笔记中的截图有可能是2013,也有可能是2015。

步骤如下:

1、从这里完整下载所有源代码

     https://github.com/ShiftMediaProject

     一共48个,实际用到了哪些我也没管,总之我全部clone到本地了。

注意:

       用git clone,这样下载下来的源代码目录无需改名,后续在VS里加载很方便。如果下载的zip,解压后注意去掉"-master "的后缀。

       建议在根目录新建个目录,比如我建了D:\ShiftMediaProject这个目录,在这个目录下面git clone,一来好管理,二来生成的exe会在代码目录的上两级。

2、打开“FFmpeg\SMP\ffmpeg_deps.sln”解决方案文件,有部分工程项目加载失败

这个时候,如果你通过菜单尝试手工添加失败的项目,会提示出错

什么都不要做!直接退出VS。

3、从这里下载“vsyasm-1.3.0-win32.zip”。

     如果是vs2013,将“vsyasm-1.3.0-win32.zip”解压到“C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations”,

     如果是vs2015,将“vsyasm-1.3.0-win32.zip”解压到“C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations“。

4、修改”vsyasm.props“文件,将文中”$(Platform) “ 修改为 ”win$(PlatformArchitecture)“,保存。

5、再次打开“FFmpeg\SMP\ffmpeg_deps.sln”解决方案文件,会发现所有项目均正常加载。

6、直接开始编译,很不幸,错误很多啊。

7、其中一个错误是(截图是别人的,我出问题后忘了截图,这里借用下,但都是类似的关于vsyasm的)

很好解决,将第3、4步改好的BuildCustomizations目录下的vsyasm工具文件同时要拷贝一份到另一个目录:

如果用的是vs2013,是“C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin”,

如果用的是vs2015,是“C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin”。

8、rebuild,第一个错误是这个

google了很久也没找到原因,后来直接把第100行给注释了,freetype2就编译通过了

谁能告诉我为什么?

9、接着处理编译错误,是这个

这个页面的左下角下载“nvidia_video_sdk_6.0.1.zip”,解压到 D:\ShiftMediaProject 目录下。

10、libavdevice项目右键 - Properties - VC++ Directories,添加

Include Directories:D:\ShiftMediaProject\nvidia_video_sdk_6.0.1\Samples\common\inc

Library Directories:D:\ShiftMediaProject\nvidia_video_sdk_6.0.1\Samples\common\lib\Win32

11、libavcodec项目右键 - Properties - VC++ Directories,同上添加inc和lib。

12、接下来build就成功了,输出的可执行文件目录在D:\msvc下。

13、如果直接debug,会提示

原因是项目设置的输出文件(Link.OutputFile)与Debugging的Command不一致,Debugging Command初始的设置是

$(TargetPath)是"D:\ShiftMediaProject\FFmpeg\SMP\..\..\..\msvc\ffplay.exe"

实际的可执行文件按下面的设置输出在 "D:\ShiftMediaProject\FFmpeg\SMP\..\..\..\msvc\bin\x86\ffplay.exe"

修改一下Debugging中的Command如下

注意在Command Arguments添加要播放的文件或者网络路径。

补充一下:有时候编译失败,会发现在编译输出目录msvc下bin不是个目录,而是个文件。应该是某个project里的Post build Event中,copy命令中目标地址bin后没有\,导致系统认为将某个文件拷贝改名为bin。比如

推荐阅读更多精彩内容