近期遇到问题需要研究一下ffmpeg某部分实现的源码,跟踪调试ffmpeg会比较直观。
编译环境:vs2019
操作系统:win10
代码工程:ShiftMediaProject
一、准备工作
下载git客户端工具,网址:Git - Downloading Package
二、下载ffmpeg源码及相关库文件
1、ShiftMediaProject工程地址:GitHub - ShiftMediaProject/FFmpeg: Unofficial FFmpeg with added custom native Visual Studio project build tools. FFmpeg: A complete, cross-platform solution to record, convert and stream audio and video.
2、克隆到本地的目标项目目录 至少需要有2层,因为期望的项目的结构是这样子的:
- msvc (OutputDir) (该项目默认的 VS 编译输出的目录) - source (这个是需要的上一级目录,待会下载的依赖项目有很多,十几二十来个依赖项目都会下载到这里) - FFmpeg (这个是 clone 到本地的项目目录) - ..Any other libraries source code.. (其他的十几二十个依赖的项目)
准备好文件夹后,比如这里上面的 "source" 文件夹,在这个文件夹下,克隆代码下来
git clone https://github.com/ShiftMediaProject/FFmpeg.git
3、下载相关依赖库
直接运行FFmpeg/SMP下的脚本project_get_dependencies.bat,但按照国内的网络环境,通过这种方式是很难成功的,所以要一个个下依赖库。在git客户端依次执行以下命令
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》解决。
4、然后,可以运行脚本project_get_dependencies.bat,去下载其它依赖文件,但鉴于网络环境,建议手动下载依赖。需要下载依赖的只有gnutls工程,进入到gnults工程目录下,使用git submodule init gnulib 与git submodule update命令进行下载。
如果没有成功下载,可以尝试手动下载,下载地址为 https://gitlab.com/libidn/gnulib-mirror.git
或者 git://git.sv.gnu.org/gnulib.git
可使用 git clone 下载代码,然后放置到 gnutls/gnulib 文件夹下即可。
三、下载安装VSNASM和VSYASM为vs项目添加nasm也yasm构建
ShiftMediaProject 提供了自动下载和安装 NASM 的安装脚本,下载地址为: Release 0.9 · ShiftMediaProject/VSNASM · GitHub
Releases · ShiftMediaProject/VSYASM · GitHub
尤其是下载NSNASM时要注意,需要与下载的ShiftMediaProject的版本保持一致。此处所有都下载最新即可。
注意:我曾经参考使用vs2015编译此工程,因为下载的nasm版本与
使用vs2015编译此工程,因为下载的nasm版本与 ShiftMediaProject版本不一致导致编译使用nasm的工程如libx264,libx265过程中出现如下错误:
error MSB4186: 静态方法调用语法“[MSBuild]::NormalizePath('$(MSBuildProjectDirectory)', '、..\source\FFmpeg\SMP\obj\Debug\x64\libavutil\cpuid.obj')”无效。未找到方法“[MSBuild]::NormalizePath”。 静态方法调用应采用以下形式:$([FullTypeName]::Method()),例如 $([System.IO.Path]::Combine(a
, b
))。
下载后解压,分别以管理员权限运行vs2019开发者命令行中执行相应文件夹中install_script.bat即可。
执行完成后,VSYASM 和VSNASM中的.props,.targets 和.xml会复制到C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomization目录下;yasm.exe会复制到C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC目录下;
其中nasm.exe需要手动下载Index of /pub/nasm/releasebuilds/2.16.02rc1/win64解压后,拷贝到C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC目录下即可。
四、下载其它依赖
此处可以参考vs2019编译ShiftMediaProject_vs 2019 gmp_cuijiecheng2018的博客
中第4部分内容。
五、编译
用vs2019打开ffmpeg_deps.sln,编译。如果我们上面的步骤都做对,那编译应该是不会出现问题的。如果编译出现问题那大概率是我们上面下载的依赖库没有下全。
六、调试运行
在vs中 “调试” -> “开始执行(不调试)” 运行程序后,可能会报错:“系统找不到指定的文件”。这是因为调试工作目录和程序输出目录没有设置一致。
可以参考
vs2019编译ShiftMediaProject_vs 2019 gmp_cuijiecheng2018的博客
进行设置。