FFmpeg是音视频开发者的入门和必备工具,其通过一套完整的接协议、解封装、解码、渲染(或播放)、编码、封装,将大量的媒体协议、封装协议、codec、filter等集成到一起。
对于许多开发者来说,想要友好的调试FFmpeg似乎是一件不太容易的事情。FFmpeg虽然支持大部分编译环境,但是大部分Windows用户使用FFmpeg时的编译、调试环境并不那么友好。不折腾一番,想要在VisualStudio上成功调试起FFmpeg,似乎不太容易。
我从17年开始第一次接触FFmpeg,到现在(2020年7月),经历过几种不同的调试FFmpeg的方式:
1、在Linux上编译FFmpeg,通过log输出的方式进行调试。对初级开发者来说,最痛苦的就是log调试了吧。后来学习了GDB,知道FFmpeg在configure的时候可以通过选项关闭优化,打开调试,使用GDB进行调试,算是初步使用工具开始了FFmpeg的调试之路。
2、在Mac上进行FFmpeg编译,用XCode或VSCode进行调试。这在Mac上的体验很好,利用IDE进行调试的感觉,大家都懂。但是Mac的用户量太少。
3、在Windwos上使用msys2(mingw)进行编译,用VisualGDB+VisualStudio进行调试。这种方式可以很好的解决在VisualStudio上进行FFmpeg调试的问题。但是VisualGDB工具不是免费的
4、在Windows上使用msys2(VC)进行编译,直接用VisualStudio进行调试。
下面是具体的做法(小白用户不用担心,我会把教程写的详细详细再详细。希望即使最小白的用户都可以最终搞定FFmpeg在Windows下用VisualStudio来进行调试。为了保证教程的准确性,我开了一台新的阿里云服务器,在上面重复下面我所写的内容)另外,考虑到大部分资源都需要在国外网站上下载,我把这篇博客需要的资源都放在了百度网盘中,大家可以自己下载:
链接:https://pan.baidu.com/s/1WS9jk9OZA4GaxlOKbdNyew
提取码:0arc
过程大致分为以下几个阶段(按照小白用户从0开始准备的。如果您对某些阶段已经很熟悉了,直接跳到您需要的环节即可)
1、获取FFmpeg源代码; 2、搭建msys2环境; 3、为FFmpeg执行VisualStudio编译的configure; 4、编译FFmpeg; 5、配置VisualStudio工程开启调试。
0、先介绍下我的环境:
Windows2019 数据中心64位中文版、msys2、VisualStudio2019。这只是我的环境,操作系统不重要;VisualStuio的版本不用非得跟我一样。ffmpeg的configure脚本中说vs2013及以后的版本都是ok的(大致意思是说:从VS2013(cl编译器大版本号为18)开始,其完整支持C99特性来编译FFmpeg)
1、如何获取FFmpeg源代码?
FFmpeg源代码可以从其官网https://ffmpeg.org/ 或从github https://github.com/FFmpeg/FFmpeg上获取。
需要说明的是:
(1)由于众所周知的原因,从国内访问这两个网站都比较慢,大家可以尝试,速度可以明显提升很多
(2)完整的FFmpeg git库比较大,为了研究使用,可以直接下载最新的某个release版本即可,如下图所示:
首先打开github地址,点击tags
然后直接点击这些链接下载相应的压缩包:
到我写这篇博客的时候,最新的release版本是4.3.1,我下载的zip压缩包,文件大小为16.8MB。
将其解压,放到某个地方,为了方便起见,我放到c盘根目录下
2、搭建msys2环境
什么是msys2?简单点说,就是在windows上创建一个仿linux命令行的环境,使得你可以在其中执行各种脚本命令。msys2集成了mingw编译环境。mingw是gcc windows的实现版本。(gcc是一群大牛写的一套编译器,基本上在各个平台都有实现)
获取msys2:https://www.msys2.org/ 通常情况下,国内用户访问这个网站会很慢,并且下载速度也很慢,可以直接从我的百度网盘中下载
然后安装,直接一路下一步就可以了。(默认安装位置是c:/msys2,这个位置可以选择自己改一下)
打开msys2 64bit环境
而后安装autoconf和automake工具,在msys2中运行:pacman -S autoconf automake make
注:网上其他教程说还需要安装gcc等其他工具。由于我们后面要用vc的编译器,所以不需要再下载gcc了
由于网速的原因,又是一个漫长的等待过程。。。。
3、为FFmpeg执行VisualStudio编译的configure由于要在msys2中使用VS的编译器,所以要先开启VC的命令行环境。
(1)windows的文件后缀名有可能被隐藏掉,所以需要关闭隐藏后缀名,如下操作:
(a)点击夹中的 查看->选项
(b)点击查看,取消勾选“隐藏已知文件类型的扩展名”
(2)在msys2安装目录下创建一个文件,命名为msys_vs2019.bat(后缀名为bat,保证其可以被执行),内容如下:(其中第二行call....是VS的安装路径)
set MSYS2_PATH_TYPE=inherit
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat"
msys2_shell.cmd -mingw64
(3)将C:\msys2\usr\bin\link.exe改一下名,因为会和vc的link.exe重名。
(4)双击msys_vs2019.bat运行,脚本将再次打开msys2环境
(5)定位到ffmpeg的目录,如果ffmpeg在c盘根目录下,需要输入: cd /c/FFmpeg-n4.3.1/
(6)执行./configure --prefix=./buildout/ --toolchain=msvc --disable-optimizations --disable-x86asm
说明: --prefix后面的路径是ffmpeg编译后执行的安装目录; toolchain是选择的编译工具 --disable-optimizations选项是禁止优化,方便后续调试;--disable-x86asm是禁止汇编优化,因为我们没有装相关工具
经过一个漫长的confugre过程后,如果出现以下内容,代表配置成功:
ffmpeg的configure过程,其实是执行一个脚本,去检查ffmpeg中集成的各个模块,需要的编译环境是否存在。如果存在,就将其集成进来,反之就不集成。最后会将配置的结果告诉给你。比如上图最后写的Enable indevs,就是说经过配置检查后,开启的输入设备有dshow、lavfi、gdigrab、vfwcap;再将msys窗口向上翻一翻,找到如下图所示内容:
会看到允许开启的硬件加速包括d3d11va,dxva;允许编译的library包括avcodec、avformat等;编译生成的程序包括ffmpeg、ffprobe;允许的解码器包括aac、escape130等。。。
(7)configure的过程在ffbuild目录下的config.log文件中。configure的结果被记录在config.mak文件中
4、编译FFmpeg
直接执行 make -j4即可:(-j4代表同时开启4个线程编译。这个看个人电脑配置,比如你的电脑最多支持8核16线程,那也可以写 make -j16,开启16个线程编译)
然后又是漫长的编译过程。。。。如果你闲着无聊,可以打开任务管理器,看看cpu疯狂工作的场景
编译过程中有三处提示错误:
(a)文件ffprobe.c,做出如下修改:
(b)文件cmdutils.c,做出如下修改:
将PRINT_LIB_INFO宏的生命注释掉,添加一个空的声明
将print_program_info的函数体都注释掉
以上两部分都是打印信息,不影响运行流程,由于时间的原因,暂时没研究编译错误的原因
修改后再次编译,可以编译成功:
其中ffmpeg_g.exe和ffprobe_g.exe是带有调试符号的版本。但是实际上VC编译器的调试符号在pdb文件中,所以这两个文件与不带_g后缀的文件大小一样:
5、配置VisualStudio工程,调试ffmpeg
(1)创建一个新的空工程,设置工程属性如下:
其中命令参数-i C:\testinput.mp4 -y c:\output.mp4代表将c盘下的testinput.mp4文件转换为c盘下的output.mp4文件,所以你需要自己准备一个testinput.mp4文件放到c盘根目录下
(2)将fftools/ffmpeg.c文件添加到本工程中,在main函数里面添加断点:
(3)点击F5运行调试,会提示编译出错,是否在上次编译成功结果上继续运行,选择“是”。然后就可以在断点处断下。
剩下的过程,大家自己去享受吧。
以上教程可能会有一些纰漏,如果大家有问题,可以给我发邮件交流讨论。