一、简介
音视频开发工程师往往需要熟悉FFmpeg源码,工作中甚至需要修改FFmpeg源码。但是如果仅仅是用Source Insight之类的程序编辑器/代码浏览器去阅读FFmpeg源码,是很难的。所以可以让大家调试FFmeg源码的ShiftMediaProject(github链接:https://github.com/ShiftMediaProject)就显得非常重要了。本文讲述使用vs2019编译该项目的方法。
二、下载ShiftMediaProject源码
第一步:下载FFmpeg源码。执行:
git clone https://github.com/ShiftMediaProject/FFmpeg.git
选一个目录下载,比如下载到D:\AudioVideo\ShiftMediaProject\FFmpeg中。
第二步:下载FFmpeg的第三方依赖库。这里网上很多教程都会让读者直接运行FFmpeg/SMP下的脚本project_get_dependencies.bat,但按照国内的网络环境,通过这种方式是很难成功的,挂了vpn也不行。所以要一个个下依赖库。
管理员启动Git CMD :
进入ShiftMediaProject\FFmpeg的上一级目录(我电脑中的是D:\AudioVideo\ShiftMediaProject)
依次执行命令(执行过程中最好挂vpn):
git clone https://github.com/ShiftMediaProject/bzip2.git
git clone https://github.com/ShiftMediaProject/fontconfig.git
git clone https://github.com/ShiftMediaProject/freetype2.git
git clone https://github.com/ShiftMediaProject/fribidi.git
git clone https://github.com/ShiftMediaProject/game-music-emu.git
git clone https://github.com/ShiftMediaProject/gmp.git
git clone https://github.com/ShiftMediaProject/gnutls.git
git clone https://github.com/ShiftMediaProject/harfbuzz.git
git clone https://github.com/ShiftMediaProject/lame.git
git clone https://github.com/ShiftMediaProject/libass.git
git clone https://github.com/ShiftMediaProject/libbluray.git
git clone https://github.com/ShiftMediaProject/libcdio.git
git clone https://github.com/ShiftMediaProject/libcdio-paranoia.git
git clone https://github.com/ShiftMediaProject/libgcrypt.git
git clone https://github.com/ShiftMediaProject/libgpg-error.git
git clone https://github.com/ShiftMediaProject/libiconv.git
git clone https://github.com/ShiftMediaProject/libilbc.git
git clone https://github.com/ShiftMediaProject/liblzma.git
git clone https://github.com/ShiftMediaProject/libssh.git
git clone https://github.com/ShiftMediaProject/libvpx.git
git clone https://github.com/ShiftMediaProject/libxml2.git
git clone https://github.com/ShiftMediaProject/mfx_dispatch.git
git clone https://github.com/ShiftMediaProject/modplug.git
git clone https://github.com/ShiftMediaProject/nettle.git
git clone https://github.com/ShiftMediaProject/ogg.git
git clone https://github.com/ShiftMediaProject/opus.git
git clone https://github.com/ShiftMediaProject/sdl.git
git clone https://github.com/ShiftMediaProject/soxr.git
git clone https://github.com/ShiftMediaProject/speex.git
git clone https://github.com/ShiftMediaProject/theora.git
git clone https://github.com/ShiftMediaProject/vorbis.git
git clone https://github.com/ShiftMediaProject/x264.git
git clone https://github.com/ShiftMediaProject/x265.git
git clone https://github.com/ShiftMediaProject/xvid.git
git clone https://github.com/ShiftMediaProject/zlib.git
下载过程中可能会报错,我们可以参考博文:
《OpenSSL SSL_read: Connection was reset, errno 10054》和
《Failed to connect to github.com port 443: Timed out》解决。
下载后得到的文件夹如下。我们一定要确保下面的文件夹都完全下载,否则后面编译的时候是会报错的。
然后我们才运行脚本project_get_dependencies.bat,去下载其它依赖文件。
三、下载安装VSNASM和VSYASM
在 https://github.com/ShiftMediaProject/VSNASM/releases 下载VSNASM
在 https://github.com/ShiftMediaProject/VSYASM/releases 下载 VSYASM
下载后解压,分别执行install_script.bat即可。
四、下载安装其它依赖
在FFmpeg/SMP下有一个readme.txt,里面的部分内容如下。所以我们还得下载这个文件里面的东西
Some of these dependency projects have additional requirements to those listed here. See the corresponding readme for each of the projects for further details.
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/*".
*OutputDir is the "Output Directory" specified in the project properties.
The default value of OutputDir is "..\..\msvc" relative to the FFmpeg source directory. An example of the expected
directory structure is:
- msvc (OutputDir)
-> source
- FFmpeg
- ..Any other libraries source code..
我们在 GLEXT - Win32 OpenGL Extension API download | SourceForge.net
下载glext.h 和 wglext.h。
在 https://www.khronos.org/registry/EGL/api/KHR/khrplatform.h
得到khrplatform.h
在 https://github.com/FFmpeg/nv-codec-headers
得到nv-codec-headers的include目录里面的内容
在 https://github.com/GPUOpen-LibrariesAndSDKs/AMF
中得到amf/public/include中的内容
下载完上述文件后,我们根据readme.txt中的提示,在ShiftMediaProject的同一级目录新建文件夹msvc(我的是D:\AudioVideo\msvc)。将上述文件按照readme.txt中说的那样放进去。
放进去以后应该是这样的:
五、编译
用vs2019(这里用vs2017应该也是可以的)打开ffmpeg_deps.sln,编译。如果我们上面的步骤都做对,那编译应该是不会出现问题的。如果编译出现问题那大概率是我们上面下载的依赖库没有下全。
六、运行
在vs中 “调试” -> “开始执行(不调试)” 运行程序后,可能会报错:“系统找不到指定的文件”。这是因为调试工作目录和程序输出目录没有设置一致。
我们更改项目属性设置:
直接将这些目录都设置为一样即可。
然后我们再运行,可能会提示无法打开lib。
所以我们再设置一下附加库目录:
完成上述步骤后,我们就可以开始愉快地设置断点调试ffmpeg.exe了
七、参考文章
《ShiftMediaProject+VS2017+win764位环境搭建》